hdu 1159

来源:互联网 发布:linux rpm qa grep 编辑:程序博客网 时间:2024/05/18 23:27

主题思想: 最长公共子序列 LCS

此題是经典dp题之一。 1AC,,主要还是要自己考虑下。
对于字符串a,b
dp[i][j] 表示以字符串a中第i个字符,和b中第j个字符结尾,最长公共子序列的长度。
初始化dp为全0.

if(a[i]==b[j])   then   dp[i][j]=dp[i-1][j-1]+1else                    dp[i][j]=max(dp[i][j-1],dp[i-1][j]

AC代码:

#include <iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>using namespace std;const int maxn=1024;int dp[maxn][maxn];int LCS(string a,string b){    memset(dp,0,sizeof(dp));    a=" "+a;    b=" "+b;    int n1=a.length();    int n2=b.length();    dp[0][0]=0;    for(int i=1;i<n1;i++){        for(int j=1;j<n2;j++){            if(a[i]==b[j]){                dp[i][j]=dp[i-1][j-1]+1;            }else{                dp[i][j]=max(dp[i][j-1],dp[i-1][j]);            }        }    }    return dp[n1-1][n2-1];}int main(){    string a,b;    while(cin>>a>>b){        int ans=LCS(a,b);        printf("%d\n",ans);    }    return 0;}
原创粉丝点击