| 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