动态规划-最长公共上升子序列-n^2解法

给定两个数列\(A, B\),如果他们都包含一段位置不一定连续的数,且数值是严格递增的,那么称这一段数是两个数列的公共上升子序列。求\(A\)\(B\)的最长公共上升子序列。

输入格式

第一行包含一个整数\(N\),表示\(A\)\(B\)的长度。

第二行包含\(N\)个整数,表示数列\(A\)

第三行包含\(N\)个整数,表示数列\(B\)

输出格式

输出一个整数,表示最长公共上升子序列的长度。

数据范围

\(1 ≤ N≤ 3000\),序列中的数字均不超过\(2^{31} - 1\).

输入样例

4 2 2 1 3 2 1 2 3

输出样例

2 2. 朴素解法\(O(n^3)\)

朴素解法将最长公共子序列和最长上升子序列模型相结合。

\(f[i][j]\)表示第一个序列的前\(i\)个数,和第二个序列的前\(j\)个数,且最后一个数为\(b[j]\)的最长公共上升子序列的长度。

则可以根据\(a[i]\)是否等于\(b[j]\)进行分类讨论。

\[f[i][j]=\left\{ \begin{array}{rcl} f[i - 1][j] & & {a[i] != a[j]}\\ max_{k < j且b[k] < b[j]}(f[i][j], f[i- 1][k]) & & {a[i] == b[j] }\\ \end{array} \right. \]

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxxpz.html