动态规划(dp):最长公共子序列和最长上升子序列

本文探讨了如何使用动态规划解决最长公共子序列和最长上升子序列问题。针对最长公共子序列,通过记忆化数组避免重复计算,降低时间复杂度至O(nm)。对于最长上升子序列,通过维护一个非降序数组并利用二分搜索,实现O(nlogn)的时间复杂度解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最长公共子序列:

给你一个序列X和另一个序列Z,当Z中的所有元素都在X中存在,并且在X中的下标顺序是严格递增的,那么就把Z叫做X的子序列。

例如:Z=<a,b,f,c>是序列X=<a,b,c,f,b,c>的一个子序列,Z中的元素在X中的下标序列为<1,2,4,6>。

现给你两个序列X和Y,请问它们的最长公共子序列的长度是多少?
输入包含多组测试数据。每组输入占一行,为两个字符串,由若干个空格分隔。每个字符串的长度不超过100。
对于每组输入,输出两个字符串的最长公共子序列的长度。

输入样例

abcfbc abfcab

programming contest

abcd mnp

输出样例

4

2

0

这道题的要求是每个字符都要经过检验,但是如果用时间复杂度为O(n^2)的逐一遍历方法不用想都知道会TLE, 所以进一步想到动态规划,可以用记忆化数组保存之前的结果。

当第一个字符串s1的长度为n,第二个字符串s2长度为m时,设二位数组dp[n][m]使得:

dp[i][j]表示s1的前i个字符组成的字符串和s2的前j个字符组成的字符串所构成的最长公共子序列的长度。所以得出dp[][]的递推关系式:

s(i+1)和t(j+1)相等时:

dp[i+1][j+1]=dp[i][j]+1

而s(i+1)和t(j+1)不相等时,有两种选择,一种是从s1中选下一个,看看和ti是否相等,另一种就取

t中的下一个字符看看和si是否相等:然后取两者之中的最大值(都相等/不等也没有关系) 

 dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j])

有这样的递推关系&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值