您的位置:首页 > 其它

poj1458解题报告

2010-11-14 18:47 393 查看
最长公共子序列问题



百度找的动态规划算法如下:



以两个序列 X、Y 为例子:

  设有二维数组 f[i,j] 表示 X 的 i 位和 Y 的 j 位之前的最长公共子序列的长度,则有:

  f[1][1] = same(1,1);

  f[i,j] = max{f[i-1][j ? 1] + same(i,j),f[i-1,j],f[i,j?1]}

  其中,same(a,b)当 X 的第 a 位与 Y 的第 b 位完全相同时为“1”,否则为“0”。

  此时,f[j]中最大的数便是 X 和 Y 的最长公共子序列的长度,依据该数组回溯,便可找出最长公共子序列。

  该算法的空间、时间复杂度均为O(n^2。





#include<iostream>
using namespace std;
int dp[300][300];
char a[300],b[300];

int maxx(int a,int b)
{
	if(a>b)
		return a;
	return b;
}
int main()
{	
	int i,j;
	while(cin>>a>>b)
	{
		memset(dp,0,sizeof(dp));
		for(i=1;i<=strlen(a);i++)
			for(j=1;j<=strlen(b);j++)
			{
				if(a[i-1]==b[j-1])
				{
					dp[i][j]=dp[i-1][j-1]+1;
				}
				else
					dp[i][j]=maxx(dp[i][j-1],dp[i-1][j]);
			}
		cout<<dp[strlen(a)][strlen(b)]<<endl;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: