Изменения

Перейти к: навигация, поиск
Решение за время O(N3)
Улучшим предыдущее решение. Пусть теперь <tex> d[i][j] </tex> - динамика, в которой элемент <tex> a[i] </tex> по-прежнему последний представитель НОВП массива <tex> a </tex>, а <tex> b[j] </tex> может не быть быть последним представителем массива <tex> b </tex>. Тогда если <tex> a[i] \neq b[j] </tex>, будем "протаскивать" последнее удачное сравнение в динамике: <tex> d[i][j] = d[i][j-1] </tex> (понять это можно так: <tex> a[i] \neq b[j] </tex> , поэтому <tex> b[j] </tex> не последний представитель НОВП из массива <tex> b </tex>, а значит предыдущий элемент НОВП находится в префиксе <tex> b[1..j-1] </tex>, но <tex> d[i][j-1] </tex> уже посчитан).
Если <tex> a[i] = b[j] </tex>, то одним дополнительным циклом пробежим по <tex> a </tex> и найдём предыдущий элемент НОВП, оканчивающейся в <tex> a[i] </tex> (он меньше <tex> a[i] </tex>). Из подходящих элементов выберем тот, для которого <tex> d[k][j] </tex> - максимальна.
Правильнее было бы использовать индекс <tex> j-1 </tex> в <tex> d[k][j-1] </tex>, то есть без элемента <tex> b[j] </tex>. Но так как последовательность ''строго возрастает'', <tex> b[j] </tex> точно не будет два раза элементом НОВП. Тогда мы, не рассматривая граничные случаи <tex> d[i][0] </tex>, можем использовать индекс <tex> j </tex> в динамике <tex> d[k][j] </tex>.
<tex> d[i][j] = max(d[k][j]) + 1 </tex> для всех <tex> k = 1..i-1, a[k] < a[i]). </tex>
vector<int> '''LCIS'''(vector<int> a, vector<int> b) d = int[n][m] // динамика prev = int[n] // массив предков '''for''' i = 1...n '''for''' j = 1...m
'''if''' a[i] == b[j]
d[i][j] := 1 //НОВП как минимум 1, состоит из одного элемента a[i] <-> b[j] '''for''' k = 1...i-1
'''if''' a[k] < a[i] '''and''' d[i][j] < d[k][j] + 1
d[i][j] := d[k][j] + 1 prev[i] := k
'''else'''
d[i][j] = d[i][j-1] //восстановление b_i := 1 //ищем лучший элемент d[b_i][m] <tex> \rightarrow </tex> max '''for''' i = 1...n '''if''' d[b_i][m] < d[i][m]
b_i := i
print(d[b_i][m]) //размер НОВП vector<int> answer pos := b_i //проходим по массиву a, выписывая элементы НОВП '''while''' pos != 0 print answer.push(a[pos]) pos := prev[pos] '''return''' answer
==Решение за время O(N<sup>2</sup>)==
Анонимный участник

Навигация