一道dp 的题,求两个字符串的最大公共子序列,第一次写,没有思路,看了别人的代码,感觉还是比较容易理解的。
题意:求两个字符串的最大公共子序列长度,可以不连续。
附上代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 1001 //N不要取太多,超了一次内存
using namespace std;
char a[N],b[N];
int dp[N][N];
int max(int a,int b) //取最大值
{
return a>b?a:b;
}
int main()
{
int n,m,i,j;
while(~scanf("%s%s",a,b))
{
n=strlen(a); //取两个序列的长度
m=strlen(b);
memset(dp,0,sizeof(dp));
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
if(a[i-1]==b[j-1])
dp[i][j]=dp[i-1][j-1]+1; //若相等,则在dp[i-1][j-1]基础上加1
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]); //若不相等,则选择两个字符串中有相同公共子序列多个记录下来
}
printf("%d\n",dp[n][m]);
}
return 0;
}