NOJ1091

以前老早做过的题,一直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:如果你看懂了上面的小提示,那么代码就很清晰了

你可能感兴趣的:(NOJ1091)