DP——最长公共子序列
好吧,我承认写这篇博客是为了凑数量,但还是要好好写……
最长公共子序列,众所周知的问题,给定两个序列,求最长公共子序列……(其实还有一种叫 diff算法的东西,更优,但我不会……)
其实,DP方程浅显易懂,直接上代码就可以……
时间复杂度O(mn)。
代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std; 8 int n,m; 9 string s,t; 10 int dp[1000][1000]; 11 12 int main(){ 13 getline(cin,s); 14 getline(cin,t); 15 n=s.length()-1; 16 m=t.length()-1; 17 for(int i=0;i<=n;i++) 18 for(int j=0;j<=m;j++){ 19 if(s[i]==t[j]){ 20 dp[i+1][j+1]=dp[i][j]+1; 21 }else{ 22 dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]); 23 } 24 } 25 printf("%d",dp[n+1][m+1]); 26 return 0; 27 }