最长公共子序列(LCS)
嘿嘿这是一个很难的东西欧。(小狗勾能有什么坏心眼呢)
---------------------------------------------------废话不多说,进入正文------------------------------------------------
最长公共子序列是什么
如果不知道子序列是什么的,建议先看看这个(其实是讲最长不下降子序列的,但里面也有关于子序列的内容),最长公共子序列,就是两个字符串之间(数字也不是不行)最长的那个一样的子串,换句话讲,就是那个是两个字符串的子序列(跟数字的子序列一个道理)中那些一样的子序列中最长的(有点啰嗦了。。。)
最长公共子序列怎么求
同最长不下降子序列,最长公共子序列也是用DP实现的,在最长不下降子序列中,dp[i]表示前i个数字中最长的不下降子序列,在最长公共子序列中,dp[i][j]表示a的前i个和b的前j个(a,b为那两个要求的字符串)最长的公共子序列,很显然,当第i个和第j个相同的时候他们的最长公共子序列就加上一了,而如果不相同,那就老老实实的从上一个状态照搬(就是i-1或j-1的状态),那么转移方程就出来了。
如果a[i]=b[j]那么dp[i][j]=dp[i-1][j-1]+1;
否则dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
接下来就是C++代码编写的状态转移方程
for(int i=1;i<=n;i++){//n为a串长度
for(int j=1;j<=m;j++){//j为b串长度
if(a[i]==b[j]){
dp[i][j]=dp[i-1][j-1]+1;
}
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
结束!!!!!!!!!!!!!!!!!!!!!!!!!