zoukankan      html  css  js  c++  java
  • 动态规划(最长公共子序列)

    有一个经典问题:

    长度为n的序列,插入若干数字后,让其形成回文串。求插入的数字最少的个数p

    p=n-最长公共子序列

    最长公共子序列可以利用动态规划的思想,具体可以用下面这个图来表示:

    //求最长公共子序列
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(s[i]==s[n-j+1])//正串和逆序串
                dp[i][j]=dp[i-1][j-1]+1;
            else
                dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
        }
    }

    将序列打印出来

    #include<iostream>
    #include<cstdio>
    #include<string>
    using namespace std;
    int dp[100][100];
    int main()
    {
        //防止数组越界,添加一下前导符
        string s="0BDCABA";
        string t="1ABCBDAB";
        int len1=s.length();
        int len2=t.length();
        for(int i=1;i<len1;i++)
        {
            for(int j=1;j<len2;j++)
            {
                if(s[i]==t[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[len1-1][len2-1]<<endl;
        int p=len1-1,q=len2-1;
        while(p>=1&&q>=1)
        {
            if(s[p]==t[q])
            {
                cout<<s[p]<<" ";
                p-=1;
                q-=1;
            }
            else if(dp[p-1][q]>=dp[p][q-1])
            {
                p-=1;
            }
            else
                q-=1;
        }
    }
  • 相关阅读:
    C/S模式客户端连接服务器连接不上的问题
    C#获取网络状态
    SQL2008R转SQL2005
    Centos7 调整磁盘空间
    crontab 定时任务
    nginx 简单教程
    vagrant 使用
    加快 hive 查询的 5 种方法
    编译 ambari 2.7.3
    kylin 连接 hortonworks 中的 hive 遇到的问题
  • 原文地址:https://www.cnblogs.com/flightless/p/8591457.html
Copyright © 2011-2022 走看看