动态规划

 

算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列

 

最长公共子序列 (从后往前分解问题)

两个字符串A,B找相同的部分,从后往前考虑,比较最后一个字符,只有2种可能,相同/不一样。html

假设 c[i,j]表示Ai 和 Bj 的LCS的长度算法

相同:说明是公共子序列的一部分,那么去掉这个元素以后就是子问题加这个元素segmentfault

    即 C[i,j]  = C[i-1,j-1] + 1        i,j >0, Ai = Bjspa

不一样:说明公共子序列的子问题须要分两种状况:.net

    最长公共子序列:要么与A串和去掉最后一个字符后B串的最长公共子序列同样设计

                            要么与B串和去掉最后一个字符后A串的最长公共子序列同样code

    即 C[i,j]  = max{C[i,j-1],C[i-1,j]}        i,j > 0, Ai != Bjhtm

初始化:C[i,j]  = 0        i=0或j=0blog

http://blog.csdn.net/hrn1216/article/details/51534607

http://blog.csdn.net/amazingcode/article/details/51694332递归

 

最长公共字符串    (分别交叉对比)

公共字符串,必须是连续的

一、把两个字符串分别以行和列组成一个二维矩阵。

二、比较二维矩阵中行和列对应的每一个点的字符是否相同,是设置这个点为1,否设置这个点为0。

三、经过查找值为1的最长对角线来找到最长公共字符串。

或者当两个点的字符相同的时候,设置成此点的左上角的数字+1,最后二维矩阵最长的数字就是最长字串长度,而后回溯出字符串便可

C[i,j]  = 0                        i=0或j=0

C[i,j]  = 0                        i,j > 0, Ai != Bj

C[i,j]  = C[i-1,j-1] + 1        i,j >0, Ai = Bj

https://www.cnblogs.com/Springtie/p/4068964.html

 

最长递增子序列(从前日后作递推)

    长度为N的字符串,找出最长递增子序列,从前日后分别求出以i位置的字符串为结尾的字串的最长递增子序列,而后找出最大值便可。

    int[N],来保存前i节字符且以i位置的字符为结尾的时候最长递增子序列的值。

    则有F(i)=Max(F(j)) + 1, 其中i>j,且ai>aj. 即:从前面全部知足条件的i>j,且ai>aj里找最大的那个加一。

    http://blog.csdn.net/iNiegang/article/details/47379873

    https://www.cnblogs.com/lonelycatcher/archive/2011/07/28/2119123.html  更优解

 

最大连续子序列和 (从前日后作递推)

    用sum(j)表示a1到aj的和,很容易求出动态规划的递归式:

         sum(j) = max(sum(j-1)+aj , aj)

http://blog.csdn.net/jiaohanhan/article/details/71809357

 

最大字串和

http://conw.net/archives/9/

http://blog.nlogn.cn/programming-pearls-the-maximum-sum-of-substring/

 

动态规划求解硬币找零问题 (从前日后作递推,考虑0/1问题)

有几种硬币面额(每种硬币无限量),给一个数字M,找出能够经过最少多少个硬币组成。

    将每一种数字须要最少找零数都算出来:F(M)

    从1计算到M-1,即F(1)~F(M-1)都已经计算出来了,那么F(M)只有三种状况:

    1.无法找                     F(M)=0

    2.恰好有同面额硬币      F(M)=1

    3.Ci为某种面额的硬币   F(M)=Min(F(M-Ci))+1       

        解释:先每种面额硬币都尝试找一枚后,看Min的数值加一就是当前的Min面额;

                也能够解释为,没种硬币分找与不找(0/1)两种状况。

http://blog.csdn.net/you12345678901234567/article/details/8130804

 

背包问题 (先获得该问题的局部解而后扩展到全局问题解,考虑0/1问题)

    构建二维矩阵:

        横坐标表示1~M容量,纵坐标标识A~Z都物品是否拿。

        该矩阵中的每一个值的求解都表明一个更小的背包问题。

        即:V[i][j]表明有i种物品,j容量时的背包问题。

    填充二维矩阵:

        第一行只有A时,容量为1~M都包分别能拿多少:若是只有一件,当不可拿时填充0,能够拿及更大容量都包包时填充相应都价值。

        第二行有AB时,容量为1~M都包分别能拿多少:若是只有一件,当不可拿时(B的大小超过背包容量)按照第一行当前背包容量填充即V[1][j], 能够拿时(B的大小未超过背包容量),计算若是拿B的话最多能拿多少,此时能够看做B的价值+背包去掉B的容量时的小背包的值(这个值是以前计算过的),获得这个值与不拿B的状况比,选择大的值填充。

http://www.importnew.com/13072.html

http://blog.csdn.net/stack_queue/article/details/53544109

https://www.cnblogs.com/liuzhen1995/p/6374541.html

https://wenku.baidu.com/view/4d68b68fbceb19e8b8f6bacd.html

 

https://www.cnblogs.com/wuyuegb2312/p/3281264.html

 

https://mp.weixin.qq.com/s?__biz=MzI1MTIzMzI2MA==&mid=2650561168&idx=1&sn=9d1c6f7ba6d651c75399c4aa5254a7d8&chksm=f1feec13c6896505f7886d9455278ad39749d377a63908c59c1fdceb11241e577ff6d66931e4&scene=21#wechat_redirect

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息