两个月没看还真忘了,- -b
动态规划的一个计算两个序列的最长公共子序列的方法如下:
以两个序列 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),经过优化后, 空间复杂度 可为O(n)。
#include<stdio.h>
#include<string.h>
int dp[1000][1000];
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int main()
{
int i,j,k,la,lb,m,n;
char a[1001],b[1001];
while(gets(a)!=NULL&&gets(b)!=NULL)
{
memset(dp,0,sizeof(dp));
la=strlen(a);
lb=strlen(b);
for(i=1;i<=la;i++)
for(j=1;j<=lb;j++)
{
if(a[i-1]==b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
}
printf("%d\n",dp[la][lb]);
}
return 0;
}
479





