洛谷 1439 最长公共子序列(动态规划)

题目:
给出1,2,…,n 的两个排列 P1和 P2,求它们的最长公共子序列。


思路:
1.整体思路:动态规划,将最长公共子序列问题转化为最长递增子序列问题
2.具体思路:
(1)将p1序列的各个数字编码
例如:p1为1357,1编码为1,3编码为2,5编码为3,7编码为4。
(2)将p2序列中的各个数字对应p1中的编码
例如:在(1)的基础上,p2为3157。3对应编码为2,1对应编码为1,5对应编码为3,7对应编码为4。
(3)point:由于数字与编码一一对应。所以p1,p2的最长公共子序列可以转化为两个编码序列的最长公共子序列。又由于在前面的设定中,p1的编码序列是递增序列,当前所求公共序列转化为了p2编码序列的最长递增子序列
求解pos数组最长递增子序列的方法:
1.创建一个新数组d数组
2.遍历pos数组
1.如果pos[i]大于d数组中当前所有数,将d数组往后再开一个位置,储存pos[i]。
(意味着:pos中最长递增子序列的长度又增加了)
2.如果pos[i]小于d数组中某一个数,停止遍历,将该数字替换为pos[i]。
(意味着:pos中最长递增子序列长度没有变,但是更新后方便pos数组后面的数字进入d序列)

如下图所示:

洛谷 1439 最长公共子序列(动态规划)_第1张图片

 AT:此处可以使用函数
lower_bound(d+1,d+js+1,pos[i])-d;//在d数组中找到第一个小于等于pos[i]的值的序号 

 

代码展示:

洛谷 1439 最长公共子序列(动态规划)_第2张图片

 

你可能感兴趣的:(c语言,c++)