题目描述:
给出两个字符串,求两个字符串的最长公共子序列的长度。
分析:
经典的动态规划题目。
设字符串为s,t。f[i][j]表示s前i个字母和t前j个字母组成的最长公共子序列长度。
状态转移方程:
f[i][j] = f[i-1][j-1]+1 (s[i]==t[j])
f[i][j] = max{ f[i-1][j] , f[i][j-1] }
/* ZJU1733 Common Subsequence */ #include #include #define N 205 #define MAX(a,b) ((a)>(b)?(a):(b)) #define clr(a) memset(a,0,sizeof(a)) int LCS(char s[],char t[]){ int i,j; int f[N][N]={0}; for(i=0;s[i];i++){ for(j=0;t[j];j++){ if(s[i]==t[j]) f[i+1][j+1]=f[i][j]+1; else f[i+1][j+1]=MAX(f[i+1][j],f[i][j+1]); } } return f[i][j]; } int main() { char s[N],t[N]; while(scanf("%s%s",s,t)!=EOF){ printf("%d/n",LCS(s,t)); } return 0; }