做動態規劃題的步驟和例子(還在完善中)

2021-07-04 01:41:06 字數 3302 閱讀 5112

動態規劃:

拿lcs舉例,設兩個字元段為x,y,當x[i]==y[j]時,  c[i,j]=k為lcs。

演算法為:

lcs(x,y,i,j);

return c[i,j];

}

此演算法像樹

結合備忘法理解lcs:

lcs(x,y,i,j);

return c[i,j];

}

備忘法即為了節省時間,將相同的工作省略,用備忘記錄結果

圖示:

a b

cb d a b

0  0  0  0  0 0 0

b 0 0  1  1  1  1 1 1

d 0 0  1  1  1  2 2 2

c 0 0  1

2  2  2 2 2

a 0 1

12  2  2 3 3

b 0 1  2  2  3

3 3 4

a 0 1  2  2  3  3 4

4

根據備忘法公式得到的**例子

第一行和第一列為初始值0,如按公式將綠色字型比較取 max ,得到藍色字型結果

紅色字型從左到右自上而下的順序即為尋找lcs的順序,最後結果為4,序列為bcba,當然這個結果不唯一,一般題目都會給出要求限制。

以下是度娘上的:

1.將待求解問題分解成若干個子問題,先求解子問題,然後從這些子

問題的解得到原問題的解。儲存已解決的子問題的答案,在需要時再找出已求得的答案,這樣就可以避免大量的重複計算,節省時間。我們可以用乙個表來記錄所有已解的子問題的答案。不管該子問題以後是否被用到,只要它被計算過,就將其結果填入表中。這就是動態規劃法的基本思路。具體的動態規劃演算法多種多樣,但它們具有相同的填**式。

2.給定k階段狀態變數x(k)的值後,如果這一階段的決策變數一經確定,第k+1階段的狀態變數x(k+1)也就完全確定,即x(k+1)的值隨x(k)和第k階段的決策u(k)的值變化而變化,那麼可以把這一關係看成(x(k),u(k))與x(k+1)確定的對應關係,用x(k+1)=tk(x(k),u(k))表示。這是從k階段到k+1階段的狀態轉移規律,稱為狀態轉移方程。

多階段決策問題中,各個階段採取的

決策,一般來說是與時間有關的,決策依賴於當前狀態,又隨即引起狀態的轉移,乙個決策序列就是在變化的狀態中產生出來的,故有「動態」的含義,稱這種解決多階段決策最優化問題的方法為動態規劃方法。

根據上例分析和動態規劃的基本概念,可以得到動態規劃的基本模型如下:

(1)確定問題的決策物件。 (2)對決策過程劃分階段。 (3)對各階段確定

狀態變數。 (4)根據狀態變數確定費用

函式和目標函式。 (5)建立各階段狀態變數的轉移過程,確定狀態轉移方程。

狀態轉移方程的一般形式:

一般形式: u:狀態; x:策略

順推:f[uk]=opt 其中, l[uk-1,xk-1]: 狀態uk-1通過策略xk-1到達狀態uk 的費用 初始f[u1];結果:f[un]。

倒推:

f[uk]=opt

l[uk,xk]: 狀態uk通過策略xk到達狀態uk+1 的費用

初始f[un];結果:f(u1)

任何思想方法都有一定的侷限性,超出了特定條件,它就失去了作用。同樣,動態規劃也並不是萬能的。適用動態規劃的問題必須滿足最優化原理和無後效性。

1. 最優化原理(最優子結構性質) 最優化原理可這樣闡述:乙個最優化策略具有這樣的性質,不論過去狀態和決策如何,對前面的決策所形成的狀態而言,餘下的諸決策必須構成最優策略。簡而言之,乙個最優化策略的子策略總是最優的。乙個問題滿足最優化原理又稱其具有最優子結構性質。

2. 無後效性將各階段按照一定的次序排列好之後,對於某個給定的階段狀態,它以前各階段的狀態無法直接影響它未來的決策,而只能通過當前的這個狀態。換句話說,每個狀態都是過去歷史的乙個完整總結。這就是無後向性,又稱為無後效性。

3.子問題的重疊性 動態規劃將原來具有指數級時間複雜度的

在程式設計中常用解決最長公共子串行問題、

矩陣連乘問題、凸多邊形最優三角剖分問題、電路佈線等問題。

記憶化給你乙個數字三角形, 形式如下:

12 3

4 5 6

7 8 9 10

找出從第一層到最後一層的一條路,使得所經過的權值之和最小或者最大.

無論對於新手還是老手,這都是再熟悉不過的題了,很容易地,我們

寫出狀態轉移方程:

f[i][j]=a[i][j] + min(a[i][j]表示當前狀態,f[i][j]表示指標函式)

對於動態規劃演算法解決這個問題,我們根據狀態轉移方程和狀態轉移方向,比較容易地寫出動態規劃的迴圈表示方法。但是,當狀態和轉移非常複雜的時候,也許寫出迴圈式的動態規劃就不是那麼簡單了。

解決方法:

我們嘗試從正面的思路去分析問題,如上例,不難得出乙個非常簡單的

遞迴函式:

int f(int i, int j, int (*a)[4])

f1=f(i-1, j, a);

f2=f(i-1, j-1, a);

if(f1opt[i, j] - 每產生乙個f(i, j),將f(i, j)的值放入opt中,以後再次呼叫到f(i, j)的時候,直接從opt[i, j]來取就可以了。於是動態規劃的狀態轉移方程被直觀地表示出來了,這樣節省了思維的難度,減少了程式設計的技巧,而執行時間只是相差常數的複雜度,避免了動態規劃狀態轉移先後的問題,而且在相當多的情況下,

遞迴演算法能更好地避免浪費,在比賽中是非常實用的。

並且記憶搜尋佔的記憶體相對來說較少。

計算核心片段:

for(inti=n-1;i>=1;--i)//從倒數第二行開始

else//右邊大

動態規劃的理解和例子集合

理解動態規劃。它的基本思想是,大事化小,小事化了。把大的事件一步步分解成小的事件,再把邊界值求出來,就可以通過遞推來求出任何乙個狀態了。首先要想到的最重要的幾點是 1.子問題重疊。2.區域性最優就是整體最優。3.先前的決策不影響後續的決策。第乙個例子 小明上台階 這個問題沒涉及到區域性最優就是整體最...

動態規劃演算法的例子

標籤 空格分隔 演算法知識文件 動態規劃 問題 求圖中一點到圖中其他點的最短路徑 輸入 起點集合 終點集合 中間結點集合,邊的集合 e e 對於任意邊e e role presentation style position relative e e e e有長度 輸出 一條從起點到終點的最短路徑 乙...

簡單記錄N個動態規劃的例子

通過最近對於一些演算法題的思考,越來越發現動態規劃方法的在時間上高效性,往往該問題可以輕鬆的找到暴力破解的方法,其時間複雜度卻不盡人意。下面來看看幾個常見的動態規劃思路的經典問題 f n 表示n階樓梯有多少種走法 f n f n 1 f n 2 f 1 1,f 2 2 例二 01揹包問題 有n個重量...