動態規劃

 

算法設計 - 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

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息