2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Подпоследовательность
Сообщение19.04.2016, 11:20 


20/10/12
235
Добрый день, уважаемые участники форума!
Задачка:
В заданной последовательности целых чисел найти максимально длинную подпоследовательность чисел такую,
что каждый последующий элемент подпоследовательности делился нацело на предыдущий.
Решение нашел, но (по-моему) перемудрил и у него неважная асимптотика.
В цикле по элементам массива решил строить деревья с $j$-м элементом в виде корня.
Строю так:
Смотрю после $j$-го элемента кратные ему, добавляю в потомки.
Для каждого потомка делаю то же самое.
Далее решаю задачу о максимальной длине от корня до листа в дереве.
Запоминаю полученное значение.
Для полученной длины $l$, можно уйти из основного цикла на $n-l $ шаге.
Возможно, что я упускаю из вида какой-то очевидный алгоритм? Жду ваших советов!

 Профиль  
                  
 
 Re: Подпоследовательность
Сообщение19.04.2016, 13:35 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
shukshin в сообщении #1116564 писал(а):
В цикле по элементам массива решил строить деревья с $j$-м элементом в виде корня.
А деревья-то зачем? Запоминаете в одной переменной начало подпоследовательности, в другой - длину. Если найдется подпоследовательность длиннее, перезаписываете.

 Профиль  
                  
 
 Re: Подпоследовательность
Сообщение19.04.2016, 13:48 


20/10/12
235
rockclimber, как вы себе это представляете?
для $j$-го элемента (начала подпоследовательности для рассмотрения) последующие элементы могут идти не подряд вплотную.
да и порядок по возрастанию значений никто не обещал. единственное условие для подпоследовательности - возрастание по индексам.
как вы предлагаете грамотно перебирать все возможные подпоследовательности с началом в $j$-м элементе?

 Профиль  
                  
 
 Re: Подпоследовательность
Сообщение19.04.2016, 14:18 
Заслуженный участник


04/03/09
906
Задачка на динамическое программирование. Пусть $a_n$ - наш массив элементов, заведем еще два массива $l_n$ - максимальная длина подпоследовательности, оканчивающейся на данном элементе и $p_n$ - индекс предыдущего элемента в такой подпоследовательности.
В псевдокоде примерно так выглядит.
Код:
for i=1 to n:
    l[i] = 1
    p[i] = 0
    for k=1 to i-1:
        if a[k] divides a[i] and l[k] + 1 > l[i]:
              l[i] = l[k]+1
              p[i] = k

Осталось только найти элемент с максимальным $l_i$ и построить подпоследовательность(в обратном порядке), переходя от $i$-го элемента к $p_i$-му. Ну и развернуть получившуюся подпоследовательность.

 Профиль  
                  
 
 Re: Подпоследовательность
Сообщение19.04.2016, 23:31 


20/10/12
235
12d3, спасибо!

 Профиль  
                  
 
 Re: Подпоследовательность
Сообщение18.08.2016, 17:04 
Аватара пользователя


06/05/16
10
Действительно, задача ведь решается тем способом, что написал rockclimber.
Пусть $L_{max}$ - длина максимальной подпоследовательности, $P_{max}$ - индекс, откуда начинается максимальная подпоследовательность.
Пусть $L_{tmp}$ - длина текущей подпоследовательности, $P_{tmp}$ - индекс начала текущей подпоследовательности.
Проходим по массиву, проверяя делимость следующего элемента на текущий. Если делится, увеличиваем $L_{tmp}$, если нет - значит, мы в конце подпоследовательности и если $L_{tmp} > L_{max}$, то присваиваем $L_{max} = L_{tmp}$.

Таким образом, за $O(n)$ мы получим $P_{max}$.

12d3, не могу вникнуть в Ваше решение. Зачем увеличивать $l_i$, если $k$-тый делит $i$-того при том, что $(k + 1) \neq i$. Вы, наверное, подумали, что каждый элемент подпоследовательности должен делить все последующие? Но если так, то, кажется, тоже что-то не то..

 Профиль  
                  
 
 Re: Подпоследовательность
Сообщение18.08.2016, 17:53 
Заслуженный участник


04/03/09
906
Видимо, я условие понял не так. Я считал, что подпоследовательность не обязательно содержит только идущие подряд элементы.

 Профиль  
                  
 
 Re: Подпоследовательность
Сообщение19.08.2016, 02:37 
Аватара пользователя


06/05/16
10
Спасибо за ответ, тогда вы предложили решение гораздо более сложной задачи.

 Профиль  
                  
 
 Re: Подпоследовательность
Сообщение19.08.2016, 03:19 
Заслуженный участник


04/05/09
4582
Подпоследовательность допускает пропуски элементов.

 Профиль  
                  
 
 Re: Подпоследовательность
Сообщение19.08.2016, 18:38 


28/04/16

57
shukshin в сообщении #1116593 писал(а):
rockclimber, как вы себе это представляете?
для $j$-го элемента (начала подпоследовательности для рассмотрения) последующие элементы могут идти не подряд вплотную.

Как это? И что там будет в промежутках?

Цитата:
да и порядок по возрастанию значений никто не обещал. единственное условие для подпоследовательности - возрастание по индексам.

Меньшее число не может поделиться нацело на большее, только и всего.

 Профиль  
                  
 
 Re: Подпоследовательность
Сообщение19.08.2016, 22:43 
Заслуженный участник


04/05/09
4582
petrov_ich в сообщении #1145207 писал(а):
shukshin в сообщении #1116593 писал(а):
rockclimber, как вы себе это представляете?
для $j$-го элемента (начала подпоследовательности для рассмотрения) последующие элементы могут идти не подряд вплотную.

Как это? И что там будет в промежутках?
Что угодно. Подпоследовательность - любое подмножество элементов в том же порядке, что и в исходной последовательности.
{ 123, 2, 234, 445 } - подпоследовательность последовательности
{ 1, 3, 123, 23424, 2, 333, 99, 234, 445, 1233 }

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group