以前老早做过的题,一直WA,当时完全没想到 最长公共子序列(LCS)这个概念,现在有了这个概念 做这题还是蛮轻松的
X={X1,X2,……Xn}
y={Y1,Y2,……Ym}
LCS的概念:如果有2个序列X , Y,都共有一个子序列Z ,且不存在比Z更长的子序列,则称Z是X和Y最长的公共子序列
若Xn=Ym 则LCS(Xn,Ym)=LCS(Xn-1,Ym-1)+1;
若Xn!=Ym 则LCS(Xn,Ym)=max(Xn-1,Ym-1);
使用递推进行计算,求[i , j]时已经求得[i-1,j] [i,j-1],[i-1,j-1]的值
这点类似于OJ的 数塔,1512 (我要钱)
题目链接:http://acm.nbut.cn/Problem/view.xhtml?id=1091
我的代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1010][1010];
char ch[1010];
char str[1010];
int lcs(int len1,int len2)
{
int i,j,len;
len=max(len1,len2);
for(i=0;i<=len;i++)
{
dp[i][0]=0;
dp[0][i]=0;
}
for(i=1;i<=len;i++)
{
for(j=1;j<=len;j++)
{
if(ch[i-1]==str[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
return dp[len1][len2];
}
int main()
{
int i,j,n,len1,len2,common;
while(cin>>ch>>str)
{
len1=strlen(ch);
len2=strlen(str);
common=lcs(len1,len2);
cout<<common<<endl;
}
}
PS:如果你看懂了上面的小提示,那么代码就很清晰了