hdu 1159 Common Subsequence

算法:

最长公共子序列(LCS)

状态转移方程:

当 i = 0 , j = 0 时 , c[i][j] = 0

当 i , j > 0 ; xi = yi 时 , c[i][j] = c[i-1][j-1] + 1

当 i , j > 0 ; xi != yi 时 , c[i][j] = max { c[i][j-1] , c[i-1][j] }

#include<stdio.h>
#include<string.h>
int dp[1010][1010];
int max(int a,int b){
    return a>b?a:b;
}
int main(){
    char s1[1010],s2[1010];
    int n,m,i,j;
    while(~scanf("%s%s",s1,s2)){
        memset(dp,0,sizeof(dp));
        n=strlen(s1);
        m=strlen(s2);
        for(i=0;i<=n;i++){
            for(j=0;j<=m;j++){
                if(i==0||j==0){
                    dp[i][j]=0;
                }else if(s1[i-1]==s2[j-1]){
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        printf("%d\n",dp[n][m]);
    }
    return 0;
}
                

你可能感兴趣的:(hdu 1159 Common Subsequence)