zoukankan      html  css  js  c++  java
  • 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);

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

                                                                                                                                                                                                       

  • 相关阅读:
    JS & JQuery 动态处理select option
    如何在Oracle中复制表结构和表数据
    基于cxf的app文件上传接口(带回显功能)
    Jenkins的详细安装及使用--windows
    git用代码库文件完全覆盖本地/git不能提交jar的设置
    Windows平台下Git服务器搭建
    Vue脚手架之Vue-cli
    Vue的生命周期
    Vue状态管理之Vuex
    Vue路由管理之Vue-router
  • 原文地址:https://www.cnblogs.com/FXY-180/p/9366031.html
Copyright © 2011-2022 走看看