C++ 最长公共子序列的长度

#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);

这也很像递推(递推没学好的要补)!;

                                                                                                                                                                                                   

posted @ 2018-07-25 15:06  FXY_ssf  阅读(1419)  评论(0编辑  收藏  举报