Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 39128 | Accepted: 15770 |
Description
Input
Output
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0本题关键在于状态转移方程,DP水题,直接贴代码
递归代码如下:
#include<iostream> #include<string> using namespace std; int dp[1000][1000];//记忆化数组 string s1,s2; int max(int a,int b) {return a>b?a:b;} int maxlen(int i,int j) { if(dp[i][j]!=-1) return dp[i][j]; if(!(i&&j)) return 0; if(s1[i-1]==s2[j-1]) dp[i][j]=maxlen(i-1,j-1)+1; else dp[i][j]=max(maxlen(i-1,j),maxlen(i,j-1)); return dp[i][j]; } int main() { while(cin>>s1>>s2) { int len1=s1.length(),len2=s2.length(); memset(dp,-1,sizeof(dp)); maxlen(len1,len2); cout<<dp[len1][len2]<<endl; } return 0; }递推代码:
#include <iostream> #include <cstring> using namespace std; char sz1[1000]; char sz2[1000]; int maxLen[1000][1000]; int main() { while( cin >> sz1 >> sz2 ) { int length1 = strlen( sz1); int length2 = strlen( sz2); int nTmp; int i,j; for( i = 0;i <= length1; i ++ ) maxLen[i][0] = 0; for( j = 0;j <= length2; j ++ ) maxLen[0][j] = 0; 55 for( i = 1;i <= length1;i ++ ) { for( j = 1; j <= length2; j ++ ) { if( sz1[i-1] == sz2[j-1] ) maxLen[i][j] = maxLen[i-1][j-1] + 1; else maxLen[i][j] = max(maxLen[i][j-1],maxLen[i-1][j]); } } cout << maxLen[length1][length2] << endl; } return 0; }//空间优化一维:(WA,哪位道友帮找下哪里错了这个。。)
#include<iostream> #include<string> using namespace std; int dp[1000]; string s1,s2; int max(int a,int b) {return a>b?a:b;} int maxlen() { int i,j,ans=0; int len1=s1.length(),len2=s2.length(); memset(dp,0,sizeof(dp)); for(i=0;i<len1;i++) { for(j=0;j<len2;j++) if(s1[i]==s2[j]) dp[j+1]=dp[j]+1; else dp[j+1]=max(dp[j],dp[j+1]); ans=ans>dp[len2]?ans:dp[len2]; } return ans; } int main() { while(cin>>s1>>s2) { cout<<maxlen()<<endl; } return 0; }
POJ 1458 Common Subsequence(最长公共子序列问题)
原文地址:http://blog.csdn.net/u014492609/article/details/40587155