传送门:http://poj.org/problem?id=1458
解题思路:
简单的最长公共子序列。
#include <iostream> #include <cstring> #include <string> #include <algorithm> #include <cstdio> using namespace std; const int MAXN=1000; int dp[MAXN][MAXN]; int main(){ string str1,str2; while(cin>>str1>>str2){ int n=str1.size(); int m=str2.size(); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(str1[i-1]==str2[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } printf("%d\n",dp[n][m]); } }
二维数组实现:
#include <iostream> #include <cstring> #include <string> #include <algorithm> #include <cstdio> using namespace std; const int MAXN=1000; int dp[2][MAXN]; int main(){ string str1,str2; while(cin>>str1>>str2){ int n=str1.size(); int m=str2.size(); memset(dp,0,sizeof(dp)); int fg=0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(str1[i-1]==str2[j-1]) dp[fg][j]=dp[!fg][j-1]+1; else dp[fg][j]=max(dp[!fg][j],dp[fg][j-1]); } fg^=1; } printf("%d\n",max(dp[0][m],dp[1][m])); } }