如果a[i]=b[j]那么dp[i][j]=dp[i-1][j-1]
否则,dp[i][j]=max(dp[i-1][j],dp[i][j-1]
最后dp[l1-1][l2-1]存的就是个数
其实最好应该从1~n但是考虑到数组下标为-1时也为1,所以这种情况可以忽略
(于1个月后发现错误,数组不能下标越界....,注意!)
原代码:
#include <stdio.h>
#include <string.h>
char a[1005];
char b[1005];
int dp[1005][1005];
int l1,l2;
int max(int c,int d)
{
return c>d?c:d;
}
int main()
{
int i,j;
while(scanf("%s%s",a,b)==2)
{
l1=strlen(a);
l2=strlen(b);
for (i=0;i<l1;i++)
for (j=0;j<l2;j++)
if (a[i]==b[j])
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[l1-1][l2-1]);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(dp,0,sizeof(dp));
}
return 0;
}
修改后的代码
#include <stdio.h>
#include <string.h>
char a[505];
char b[505];
int dp[505][505];
int max(int c,int d)
{
return c>d?c:d;
}
int main()
{
int n,i,j,l1,l2;
while(scanf("%s%s",a+1,b+1)==2)
{
l1=strlen(a+1);
l2=strlen(b+1);
memset(dp,0,sizeof(dp));
for (i=1;i<=l1;i++)
for (j=1;j<=l2;j++)
if (a[i]==b[j])
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[l1][l2]);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
return 0;
}
LCS最长公共子序列入门题
最新推荐文章于 2022-03-13 15:58:40 发布