Лёгкая Наибольшая возрастающая подпоcледовательность. - Rust
  • Чаты 4chT.com в телеграмм
    Наши группы в телеграмм

Вопрос Лёгкая Наибольшая возрастающая подпоcледовательность.

Регистрация
12 Авг 2013
Сообщения
89
Репутация
0
Спасибо
0
Монет
0
Ограничение по времени работы программы: 2 секунды







Дана последовательность целых чисел. Постройте наибольшую возрастающую подпоследовательность данной последовательности.





Входные данные





В первой строке входных данных записано число элементов последовательности N,0 < N < 1001 . Во второй строке записаны N целых чисел через пробел.







Выходные данные





Требуется вывести наибольшую возрастающую подпоследовательность данной последовательности (последовательность чисел через пробел). Если таких подпоследовательностей несколько, необходимо вывести одну (любую) из них.







у меня вот такой код, но проходит только на 4 теста из 18

298249966_9f329eb537876b189a2faa1ec4639eac_800.png

 
Регистрация
19 Дек 2013
Сообщения
84
Репутация
-4
Спасибо
0
Монет
0
N до тысячи... Тут даже квадрат зайдет. Банальная динамика:
d - длина НВП, оканчивающейся в i-том элементе
изначально все d'шки равны 1 (последовательность из 1 элемента не нарушает условий)
дальше простецкие переходы: перебираем каждый элемент(i) и вложенным циклом все элементы до текущего(j). Если a > a[j], то d = max(d, d[j] + 1).
Ну и в конце, думаю, уже и сам догадался, что берем максимум из всех d'шек, это длина НВП.

Ответ восстанавливаешь рекурсивно: запоминаешь индекс наибольшей d'шки и идешь от него назад пока не встретишь индекс с d'шкой равной длине НВП минус один и a'шка, которого меньше, чем a'шка последнего элемента, и так далее.

Я питонист, конечно, так себе, но вот, что на скорую руку набросал:
297848424_17088215ac8927c79fcd0936d0b0aea6_800.jpg


Теперь советую подумать как оптимизировать до O(nlogn) :)
 
Регистрация
18 Окт 2013
Сообщения
83
Репутация
0
Спасибо
0
Монет
0
Что значит "наибольшая"? Самая длинная? Содержащая самый большой элемент? Содержащая самую большую сумму элементов?

Как получаем подпоследовательность? Просто берём срез? Или можно выбрасывать отдельные элементы?

Если правильны первые варианты, то: _, a = input(), list(map(int, input().split()))
a += [a[-1] - 1] # заглушка - чтобы не городить лишние проверки
max_start, max_len, cur_start, cur_len = 0, 0, 0, 1
for i in range(1, len(a)):
if a > a[i - 1]: cur_len += 1
else:
if cur_len > max_len: max_start, max_len = cur_start, cur_len
cur_start, cur_len = i, 1
print(*a[max_start : max_start + max_len])
 
Регистрация
25 Дек 2013
Сообщения
91
Репутация
0
Спасибо
0
Монет
0
Если можно выбрасывать элементы, то какая же это подпоследовательность ? Это уже не подпоследовательность, а чёрти что! В любой возрастающей (но не строго возрастающей !) подпоследовательности каждый последующий элемент (если он есть) не может быть меньше предыдущего. Одно из самых простых (но отнюдь не оптимальных !) решений здесь такое:
294565678_25ea770b7b7b6056cb168ed33b7ef747_800.jpg

Но наверняка можно придумать и что-то более хитрое. А если подпоследовательность максимальной длины должна быть всё таки не возрастающей, а строго возрастающей, то это несколько иная задача. Также как и задача с "подпоследовательностью", которая таковой вообще не является...
 
Сверху Снизу