题意:给出两个字符串,求两个字符串的公共子序列(不是公共子串,不要求连续,但要符合在原字符串中的顺序)
动态规划:如果a[i]==b[j];dp[i][j]=dp[i-1][j-1]+1;如果a[i]!=b[j];dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
#include<cstdio>
#include<cstring>
#include <iostream>
#define maxn 1005
using namespace std;
char a[maxn],b[maxn];
int dp[maxn][maxn];
int main()
{
while(~scanf("%s%s",a,b))
{
int len1=strlen(a),len2=strlen(b);
for(int i=0;i<len1;i++)
dp[i][0]=0;
for(int i=0;i<len2;i++)
dp[0][i]=0;
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if(a[i-1]==b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=(dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1]);
}
}
printf("%d\n",dp[len1][len2]);
}
return 0;
}