1 题目编号:1002
2 题目内容:
abcfbc abfcab programming contest abcd mnp
4 2 0
3 题意:求出两个串的公共子序列的长度。
4 解题思路形成过程:p[i][j]表示s1长度为i的前缀和s2长度为j的前缀的最长公共子序列的长度。考虑s1的第i+1个字符位置要么匹配。要么不匹配。匹配的话只能和前j个位置匹配。如果s1[i+1]==s2[j]的话那么dp[i+1][j]=dp[i][j-1]+1很显然成立。如果s1[i+1]!=s2[j]的话i+1只能和前s2 的前j-1个位置匹配。dp[i+1][j]=dp[i+1][j-1]不匹配前s1的i+1个位置的话。dp[i+1][j]=dp[i][j]。那么dp[i+1][j]=max(dp[i][j],dp[i+1][j-1])这样就把s1的第i+1个位置确定了。5 代码:#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=1010;
int dp[maxn][maxn];
char s1[maxn],s2[maxn];
int main()
{
int i,j,len1,len2;
while(~scanf("%s%s",s1+1,s2+1))
{
len1=strlen(s1+1);
len2=strlen(s2+1);
memset(dp[0],0,sizeof dp[0]);
for(i=1;i<=len1;i++)
{
for(j=1;j<=len2;j++)
{
if(s1[i]==s2[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[len1][len2]);
}
return 0;
}