动态规划问题初步:序列类和双序列类

Posted 折花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划问题初步:序列类和双序列类相关的知识,希望对你有一定的参考价值。

概述

动态规划和分治算法类似,都是通过组合子问题的解来求解原问题,但是分治算法将问题划分为不相交的子问题,往往会产生大量的计算,而动态规划应用于子问题重叠的情况,保存子问题的解,避免不必要的计算。

常见问题形式和解决要素:很重要,加急,加重

常见的动态规划问题的目的有最大最小值,统称最优解、方案可行性和总数等。常见的题目类型有序列、矩阵、划分、区间、背包、状态压缩、树,问题要素有:状态、状态转移方程、初始值、目标解。


钢条切割问题

这是算法导论上的入门题目,首先我们找到状态转移方程,方程代表着我们如何将当前问题的求解转移到子问题的求解上。钢条的初始长度为4,我们面临两种选择,切还是不切,得到不切的价格为f(4) = n4,切的价格为f(4)=n1+f(3),所以通过方程:f(4) = max(n4,n1+f(3)),就将问题转移到了切割3长度钢条上,同理直至为1,不断的递归直到求解完毕。

当然有很多的子问题的解是共用的,比如2长度的解,3长度的解,我们可以使用一个数据结构将这些解保留以重用。

以上是备忘录的自顶向下方法,自底向上的方法思路更为明确,即求解n=1时的最优解,在此基础上求解n=2的最优解,往上直到n=4,自底向上我们可以保留最优解是如何切割的。这个问题比较基础就不编码了。


跳跃游戏

这是leetcode上的一道动态规划题目,分析思路一致,也是寻找到状态转移方程,事实上序列和矩阵的状态一般都是下标。


初级阶段霸主级别题目:最长公共子序列

初级阶段是我看见后面的压缩和树类题目后默默添加上去的,哭,这个问题一个不容易想到的一点就是:对于序列X(x1,x2,x3,x4...xm)和序列Y(y1,y2,y3,y3,...yn)的最长公共子序列Z(z1,z2,z3,,,,zk)有以下特征:

1、如果xm=yn:Zk-1 是 Xm-1和Yn-1的一个最长公共子序列

2、否则,若Zk != Xm ,Zk就是Xm-1和Yn的一个最长公共子序列

3、否则,若Zk != Yn ,Zk就是Xm和Yn-1的一个最长公共子序列


然后自底向上,按照以上规则,公式如下:

1、当i=0或j=0时,C[i,j] =  0;

2、当Xi=Yj时,C[i,j] = C[i-1,j-1] + 1

3、否则,看特征3,不想打公式了


例题见算法导论,先求解X1和Y1的最直到长公共子序列,得到C[1,1] = 0,然后求X1和Y1,Y2的LCS,依次类推,记录每个X和Y的LCS,直到遍历完整个空间,得到最终的LCS。

假设,X{A,D,V,F,F,D,F,G,G},Y{W,F,R,R,H,H,D,T,I}简单总结就是,最终的LCS也就是C[9,9],按照特征需要C[8,8]和C[8,9],C[9,8],而后续的三者又分别需要C[7,7]......,再后续又需要C[6,6]........,直到需要C[1,1]C[0,0],C[0,1],C[1,0],他们一定为0或单个字符的比较。就这样不断的分治获得结果。


太长还困不想编码。


下一步就要搞压缩和树的动态规划,另外更新今天所有代码,还会做一下背包问题的动态规划,这样动态规划类的题目就算全部眼熟了。

以上是关于动态规划问题初步:序列类和双序列类的主要内容,如果未能解决你的问题,请参考以下文章

用非人类的语言描述动态规划

动态规划:基因序列比对

动态规划之最大递增子序列

关于用动态规划法求最大公共子序列的问题

动态规划,大牛的进

动态规划 最长公共子序列 过程图解