LCS 算法
f[i][j] 一定是 f[i-1][j] 和 F【i】[j-1] 转移过来的。
如果 把 a 串 看成字符数组 s1[], b 串 看成 s2[] ;
则:
如果 s1[i]!=s2[j]
那么 从 f[i-1][j] 和 f[i][j-1] 取一个最大值 记录到 F【i] [j].
代码如下:
f[i][j]=max(f[i-1][j],f[i][j-1]);
如果 s1[i] == s2[j]
那么 f[i][j] 是由 F【i-1][j-1]+1 推来的;
用dp方程式可以推出,如图:
最后附上代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s1[50000],s2[50000]; 4 int f[500][500]; 5 int main(){ 6 scanf("%s%s",s1+1,s2+1); 7 int l1= strlen(s1+1),l2= strlen(s2+1); 8 for(int i=1;i<=l1;i++) 9 for(int j=1;j<=l2;j++) 10 if(s1[i]!=s2[j])f[i][j]=max(f[i-1][j],f[i][j-1]); 11 else f[i][j]=f[i-1][j-1]+1; 12 printf("%d\n",f[l1][l2]); 13 }
OVER!