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
915
Задачка на динамическое программирование. Пусть $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
915
Видимо, я условие понял не так. Я считал, что подпоследовательность не обязательно содержит только идущие подряд элементы.

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


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

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


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

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


28/04/16

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

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

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

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

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


04/05/09
4593
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, Супермодераторы



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

Сейчас этот форум просматривают: dgwuqtj


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

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