動態規劃及簡單實例

一、動態規劃

動態規劃通常是用來求最優解問題的一種思路或方法。動態規劃的基本思想是將要求解的問題分爲若干子問題,當前子問題的最優解可以從上次子問題的解推出,從而求出原問題的最優解。
動態規劃求解過程可簡單分爲兩個步驟:前一子問題求出解時的狀態和前一子問題到當前子問題的狀態轉移方程。

二、簡單實例

最近遇到的使用動態規劃求最優解的兩個問題
1、在m*n的矩陣上,從左上角出發,每步只能向下走或向右走,每個位置上有一個數,將行走路線上所有經過的位置上的數值求和,求到達右下角時可以獲得的最大值。
運用動態規劃思想進行分析:到達第(i,j)位置時的最大值應該等於前一步(可能是(i-1,j)或(i,j-1))獲得的最大值加上(i,j)位置的值(0 <= i < m, 0 <= j < n)。

算法思路如下:

(1)設每個位置的值爲num[i][j],定義數組max[i][j]來存儲每個位置的最大值;
(2)i=0,j=0;時,max[i][j] = num[i][j];(計算起始點)
(3)i=0,j!=0;時,max[i][j] = max[i][j-1] + num[i][j];
i!=0,j=0;時,max[i][j] = max[i-1][j] + num[i][j];(計算兩條邊界)
(4)i!=0,j!=0;時,max[i][j] = Max(max[i-1][j], max[i][j-1]) + num[i][j];
(5)最後max[m-1][n-1]即爲所求。

代碼實現-Java

2、最長迴文子序列,一個字符串cbeffboc中可能存在迴文的子序列,如c,cc,cbc,cbbc,cbffbc等,求最長迴文子序列的長度。
運用動態規劃的思想來考慮的話,當前串(cbeffboc)中最長迴文子序列的長度可以由比其長度小的串(beffbo)中最長迴文子序列的長度求出(+2)。
算法思路
(1)已知字符串數組str,長度len,設pN[i][j]表示str中第i位到j位子串的最長迴文子序列的長度;
(2)子串長度爲1時,其最長迴文子序列長度爲1,pN[i][j] = 1;
子串長度大於1時,對收尾字符串判斷:
若相等,pN[i][j] = 2 + pN[i+1][j-1];
不等,pN[i][j] = Max(pN[i+1][j], pN[i][j-1]);
(3)最後可求出原字符串的最長迴文子序列pN[0][len-1]

代碼實現-Java

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章