最长公共子序列解题报告
if(x[i]==y[j]) f[i][j]=f[i-1][j-1]+1; else if(x[i]!=y[j]) f[i][j]=max(f[i-1][j], f[i][j-1]);
这一块其实
动规方程是
f[i][j]=max(f[i-1][j-1]+(x[i]==y[j]), f[i][j-1], f[i-1][j]);
可以联系到射箭一题
1 #include <stdio.h> 2 #define maxn 501 3 int x[maxn], y[maxn], f[maxn][maxn]; 4 int max(int a, int b) 5 { 6 if(a>b) return a; 7 return b; 8 } 9 int main() 10 { 11 int i, j, lx, ly; 12 scanf("%d%d", &lx, &ly); 13 for(i=1; i<=lx; i++) scanf("%d", &x[i]); 14 for(i=1; i<=ly; i++) scanf("%d", &y[i]); 15 for(i=1; i<=lx; i++) 16 for(j=1; j<=ly; j++) 17 { 18 if(x[i]==y[j]) f[i][j]=f[i-1][j-1]+1; 19 else if(x[i]!=y[j]) f[i][j]=max(f[i-1][j], f[i][j-1]); 20 //可以变成一句 21 //f[i][j]=max(f[i-1][j-1]+(x[i]==y[j]), f[i][j-1], f[i-1][j]); 22 } 23 printf("%d", f[lx][ly]); 24 return 0; 25 }