题意:
求两个字符串中相等子序列的最大长度。
思路:
用f[i][j]表示a的第i个和b的第j个之间的最长子序列,可得动态转移方程:
如果a[i-1]=b[j-1] f[i][j]=f[i-1][j-1]+1;
如果a[i-1]不等于b[j-1] f[i][j]=max(f[i-1][j],f[i][j-1])
代码:
#include<cstdio>
#include<cstring>
int f[1001][1001];
char a[1001],b[1001];
int max(int x,int y){return x>y?x:y;}
int main()
{
while (scanf("%s%s",a,b)!=EOF)
{
for (int i=1;i<=strlen(a);i++)
for (int j=1;j<=strlen(b);j++)
{
if (a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1]+1;//相等的话就等于上一次的加1
else f[i][j]=max(f[i][j-1],f[i-1][j]);//不然就取b上次和a上次的最大值
}
printf("%d\n",f[strlen(a)][strlen(b)]);
memset(f,0,sizeof(f));memset(a,0,sizeof(a));memset(b,0,sizeof(b));//要清零
}
}