#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int dp[5005][5005];
char a[5005],b[5005];
int main()
{
cin>>a+1>>b+1;
int n=strlen(a+1);
int m=strlen(b+1);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++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]);
}
cout<<dp[n][m];
}
还是先把代码写出来吧(抄袭没有意义!)
试题描述:
给定两个字符串 str1 和 str2 ,如果将 str1 去掉一些字符后得到字符串str,将str2去掉一些字符后也能得到字符串 str ,我们就说 str 是 str1 和 str2 的一个公共子串。当然在得到str的时候不能改变字符的相对顺序。请你编写程序求出字符串 str 长度的最大值。
输入:
两行,每行一个只含英文字母的字符串
输出:
一个数,表示两个字符串的最长公共子串的长度
输入示例:
ABCEF
BMCGUAFB
输出示例:
3
其他说明:
输入的字符串长度均不超过1000
这道题一看还以为是搜索,可如果是搜索的话时间超限便不可避免了;
所以还是要用DP 我们的可爱的(可恨)的动态规划;
这道题的难点只有一个——转移方程!!!!;
代码中 dp[i][j]是一种状态,表示序列X的前i个元素和序列Y的前j个元素的公共最长子序列的长度。so 转移方程为:dp[i][j]=0 (若i=0或j=0);
=dp[i-1][j-1]+1 (若i=0或j=0,x[i]==j[i])
=max(dp[i][j-1],,dp[i-1][j]) (若i,j>0,x[i]!=y[i])
####你可以从中发现:最长公共子序列不是唯一的,但长度一定是唯一的!
时间复杂度 0(lend1*lend2);
这也很像递推(递推没学好的要补)!;