题目描述:给出两个字符串,求两个字符串的公共子序列(不是公共子串,不要求连续,但要符合在原字符串中的顺序)
in:
abcfbc abfcab
programming
contest abcd mnp
out:
4
2
0
状态转移方程:
如果s1[i]==s2[j] 则 c[i][j]=c[i-1][j-1]+1
如果s1[i]!=s2[j] 则 c[i][j]=max(c[i-1][j],c[i][j-1])
#include <iostream> #include <cstring> #include <string> #include <algorithm> using namespace std; int dp[10010][10010]; string s1,s2; int a,b; int main() { while(cin>>s1>>s2) { a=s1.size(); b=s2.size(); for(int i=0;i<=a;i++) { for(int j=0;j<=b;j++) { if(i==0||j==0) { dp[i][j]=0; continue; } if(s1[i-1]==s2[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } cout << dp[a][b] << endl; } return 0; }