最长公共子序列解题报告

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 }
完整代码
原文地址:https://www.cnblogs.com/formiko/p/4418209.html