标签:
原题链接:点击此处
解题思路:
详情可见,算法竞赛入门经典(刘汝佳的那本紫书)第二版275页。
dp(i,j)表示的是A1,A2,A3....,Ai和B1,B2,B3...Bj的最长公共子序列(LCS)的长度。
当A[i]=B[i]时,dp(i,j)=d(i-1,j-1)+1;
否则dp(i,j)=max{dp(i,j),dp(i,j-1)};
源代码如下:
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int dp[1001][1001]; int max (int a ,int b ) { if(a>b) return a; else return b; } int main() { char a[1001]; char b[1001]; int len1,len2; while(~scanf("%s %s",a,b)) { len1=strlen(a); len2=strlen(b); for(int i=0;i<=len1;i++) dp[i][0]=0; for(int i=0;i<=len2;i++) dp[0][i]=0; for(int i=1;i<=len1;i++) for(int j=1;j<=len2;j++) { if(a[i-1]==b[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[len1][len2]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/gdvxfgv/p/5767593.html