动态规划-专题

LCS 最长公共子序列

class Solution {
public:
    /**
     * @param A, B: Two strings.
     * @return: The length of longest common subsequence of A and B.
     */
    int longestCommonSubsequence(string A, string B) {
        // write your code here
        int lena=A.length(),lenb=B.length();
        int dp[lena][lenb];
        memset(dp,0,sizeof(dp));
        for(int i=0;i<lena;i++)
        {
            if(A[i]==B[0]) dp[i][0]=1;
        }
        for(int j=0;j<lenb;j++)
        {
            if(B[j]==A[0]) dp[0][j]=1;
        }
        for(int i=1;i<lena;i++)
        {
            for(int j=1;j<lena;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]);
            }
        }
        return dp[lena-1][lenb-1];
    }
};

  

最长公共子串(连续)

int longestCommonSubsequence(string A, string B)
{
    int lena=A.length(),lenb=B.length();
    int dp[lena][lenb];
    int ret=0;
    for(int i=0;i<lena;i++)
    {
        if(A[i]==B[0])
        {

            dp[i][0]=1;
            ret=1;
        }
    }
    for(int i=0;i<lenb;i++)
    {
        if(A[0]==B[i])
        {
            dp[0][i]=1;
            ret=1;
        }
    }

    for(int i=1;i<lena;i++)
    {
        for(int j=1;j<lenb;j++)
        {
            if(A[i]==B[j])
            {
                dp[i][j]=dp[i-1][j-1]+1;
                ret=max(ret,dp[i][j]);
            }
            else dp[i][j]=0;

        }
    }
    return ret;

}

  最短编辑距离

int minDistance(string word1, string word2) {
        // write your code here
        int lena=word1.length(),lenb=word2.length();
        int dp[lena+1][lenb+1];
        for(int i=0;i<=lena;i++)
        dp[i][0]=i;
        for(int i=0;i<=lenb;i++)
        dp[0][i]=i;
        for(int i=1;i<=lena;i++)
        {
            for(int j=1;j<=lenb;j++)
            {
                int del=dp[i-1][j]+1;
                int ins=dp[i][j-1]+1;
                int chan=dp[i-1][j-1]+(word1[i-1]==word2[j-1]?0:1);
                dp[i][j]=min(min(del,ins),chan);
            }
        }
        return dp[lena][lenb];
    }

  

时间: 2024-08-05 16:52:08

动态规划-专题的相关文章

动态规划专题(一) HDU1087 最长公共子序列

Super Jumping! Jumping! Jumping! 首先对于动态规划问题要找出其子问题,如果找的子问题是前n个序列的最长上升子序列,但这样的子问题不好,因为它不具备无后效性,因为它的第n+1的数会影响前n个序列的长度,换句话说,如果第n+1个数加上去不一定使得和前n个数加起来就是最长子序列,具体例子很多比如5,6,1,2 第5个数是3,那么最长序列5,6加3不会比1,2加3长. 比较好的子问题是“求以第K个为终点的最长上升子序列”,其实这个子问题的好处在于它限定了一点,终点为第k个

动态规划专题 01背包问题详解【转】

对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢! 初识动态规划 经典的01背包问题是这样的: 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个物品放

动态规划专题总结

动态规划所适用的问题是一个问题可以被分成若干个阶段,每一个阶段都需要做出决策,并且影响的下一个阶段的决策. 动态规划常常适用于重叠子问题,和最优子结构,的问题. 动态规划背后的基本思想非常简单.大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解. 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表. 这种做法在重复子问题的数目关于输

动态规划专题小结:四边形不等式优化

今天第一次学习四边形不等式优化dp,感觉优化效果十分给力,不过数学味道比较浓重,证明比较复杂.因此这里删繁就简,给出关于四边形不等式优化必须要明白的地方,以后直接套用条件即可. 四边形不等式优化条件 在动态规划中,经常遇到形如下式的转台转移方程: m(i,j)=min{m(i,k-1),m(k,j)}+w(i,j)(i≤k≤j)(min也可以改为max) 上述的m(i,j)表示区间[i,j]上的某个最优值.w(i,j)表示在转移时需要额外付出的代价.该方程的时间复杂度为O(N^3). 下面我们通

动态规划专题小结:最长上升子序列(LIS)问题

(1)问题描述:给定n个整数A1,A2,A3...An.按照从左往右的顺序选择尽可能多的整数,组成一个上升子序列,其中相邻元素不能相等. (2)解题思路:本题就是经典的最长上升子序列问题(Longest Increasing Subsequence,LIS).可以通过动态规划解决.定义状态d(i)表示以下标i结尾的LIS的最大长度.那么不难得到如下状态转移方程: d(i)=max{0,d(j)|j<i,Aj<Ai}+1; 最终的答案为max{d(i)}.时间复杂度为O(N^2).由于这种方法十

动态规划专题 01背包问题详解 HDU 2546 饭卡

我以此题为例,详细分析01背包问题,希望该题能够为初学者对01背包问题的理解有所帮助,有什么问题可以向我提供,一同进步^_^ 饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14246    Accepted Submission(s): 4952 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即

动态规划专题 多阶段决策问题 蓝桥杯 K好数

问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22.30.31.33 共7个.由于这个数目很大,请你输出它对1000000007取模后的值. 输入格式 输入包含两个正整数,K和L. 输出格式 输出一个整数,表示答案对1000000007取模后的值. 样例输入 4 2 样例输出 7 数据规模与约定 对于30%的数据,KL <= 106: 对于50%的

动态规划专题 最长公共子序列

一些概念: (1)子序列: 一个序列A = a1,a2,--an,中任意删除若干项,剩余的序列叫做A的一个子序列.也可以认为是从序列A按原顺序保留任意若干项得到的序列. 例如: 对序列 1,3,5,4,2,6,8,7来说,序列3,4,8,7 是它的一个子序列.对于一个长度为n的序列,它一共有2^n 个子序列,有(2^n – 1)个非空子序列. 请注意:子序列不是子集,它和原始序列的元素顺序是相关的. (2)公共子序列 : 顾名思义,如果序列C既是序列A的子序列,同时也是序列B的子序列,则称它为序

动态规划专题选做

线性\(\mathrm{DP}\) 「TJOI2019」甲苯先生的字符串 线性动态规划+矩阵加速 区间\(\mathrm{DP}\) 原文地址:https://www.cnblogs.com/liubainian/p/11524198.html

【动态规划专题】1:斐波拉契数列问题的递归和动态规划

<程序员代码面试指南--IT名企算法与数据结构题目最优解> 左程云 著 斐波拉契数列问题的递归和动态规划 [题目]:给定整数N,返回斐波拉契数列的第N项.补充问题1:给定整数N,代表台阶数,一次可以跨2个或者1个台阶,返回有多少种走法.补充问题2:假设农场中成熟的母牛每年只会生产1头小母牛,并且永远不会死.第一年农场只有1只成熟的母牛,从第2年开始,母牛开始生产小母牛.每只小母牛3年后成熟又可以生产小母牛.给定整数N,求出N年后牛的数量. [举例]斐波拉契数列f(0)=0, f(1)=1,f(