洛谷 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序列)

如下图所示:

bef73615d8a34ef894868166df1e5122.jpg

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

 

代码展示:

79c00b2b28824b3bb54cc383d87a07ca.jpg

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值