poj1458最长公共子序列(动态规划)
问题:北大oj1458
**c[i][j]**表示x字符串的前i个字符与y字符串前j个字符的最长公共子序列;
如果x的第i个字符与y的第j个字符相同,那么从c[i][j]肯定等于c[i-1][j-1]。
如果x的第i个字符与y的第j个字符不相同,c[i][j]肯定是c[i-1][j]或者c[i][j-1]中的一个较大值。
//poj1458最长公共子序列
#include<stdio.h>
#define N 1000
int c[N+1][N+1];
char x[N+1],y[N+1];
int max(int a,int b) {
if(a>b) return a;
else return b;
}
int lengh(char a[]) {
int i;
for(i=1; a[i]!='\0'; i++);
return i;
}
int main() {
int m,n;int i;int j;
//x[0]和y[0]用不到,专门赋一个值,此处可以删去
x[0] = y[0] = '$';
while(scanf("%s%s",&x[1],&y[1])!=EOF) {
//m、n是两段字符的长度
m=lengh(x)-1;
n=lengh(y)-1;
//此处是给c[i][0]和c[0][i]全赋值为零,后边的for循环下标是从1开始,那i-1就是0,不能出错
for(i=0; i<=m; i++)
c[i][0]=0;
for(i=0; i<=n; i++)
c[0][i]=0;
//动态规划
for(i=1; i<=m; i++) {
for(j=1; j<=n; j++) {
if(x[i]==y[j]) {
c[i][j]=c[i-1][j-1]+1;
}
if(x[i]!=y[j])
c[i][j]=max(c[i-1][j],c[i][j-1]);
}
}
//输出
printf("%d\n",c[m][n]);
}
return 0;
}