Изменения

Перейти к: навигация, поиск
Решение за время O(N4)
==Решение за время O(N<sup>4</sup>)==
Построим следующую динамику: <tex> d[i][j] </tex> - это длина наибольшей возрастающей подпоследовательности массивов <tex> a </tex> и <tex> b </tex>, последний элемент которой <tex> a[i] </tex> и <tex> b[j] (a[i] = b[j]) </tex>. Будем заполнять <tex> d[i][j] </tex> сначала по увеличению <tex> i </tex>, а при равенстве по увеличению <tex> j </tex>. Ответом на задачу будет максимум из всех элементов <tex> d[i][j] </tex>, (где <tex> i = 1...n </tex>, <tex> j = 1...m. </tex>)
Заполнять <tex> d </tex> будем следующим образом: на очередном шаге сравниваем элементы <tex> a[i] </tex> и <tex> b[j] </tex>.
Если <tex> a[i] \neq b[j] </tex>, то <tex> d[i][j] = 0 </tex> (так как нет НОВП, оканчивающейся в разных элементах).
Если <tex> a[i] = b[j] </tex>, то эти элементы могут быть частью НОВП. Переберём, какие элементы стояли перед ними в массивах <tex> a </tex> и <tex> b </tex>. Заметим, что предыдущие значения <tex> d </tex> уже известны, тогда очередное значение <tex> d[i][j] = max(d[k][l] + 1, </tex> для всех <tex> k = 1..i-1 </tex> и <tex> l = 1..j-1), </tex> при условии, что <tex> a[k] = b[l] </tex>
Для восстановления подпоследовательности можно хранить массив предков <tex> prev[1..n] </tex> массива <tex> a: prev[i] </tex> - индекс предыдущего элемента НОВП, которая оканчивается в <tex> a[i] </tex>.
vector<int> LCIS(vector<int> a[n], vector<int> b[m] ) d= int[n][m] //динамика prev= int[n] //массив предков inputData(a, n) inputData(b, m)
'''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
'''for''' l = 1...j-1
'''if''' a[k] == b[l] '''and''' a[k] < a[i] '''and''' d[i][j] < d[k][l] + 1
d[i][j] := d[k][l] + 1 prev[i] := k // восстановление b_i := 1 //ищем лучшую пару (b_i, b_j) b_j := 1 //d[b_i][b_j] <tex> \rightarrow </tex> max
'''for''' i = 1...n
'''for''' j = 1...m
'''if''' d[b_i][b_j] < d[i][j]
b_i := i b_j := j print(d[b_i][b_j]) //размер НОВПvector<int> answer pos := b_i //проходим по массиву a, выписывая элементы НОВП
'''while''' pos != 0
printanswer.push(a[pos]) pos := prev[pos] '''return''' answer
==Решение за время O(N<sup>3</sup>)==
Анонимный участник

Навигация