動態規劃(詳細總結 例題)

2021-09-17 20:17:32 字數 1478 閱讀 9490

遞迴到動規的一般轉化方法:

遞迴函式 有n個引數,就定義乙個n為的陣列,陣列的下標是遞迴函式引數的取值範圍,陣列元素的值是遞迴函式的返回值,這樣就可以從邊界值開始,逐步填充陣列,相當於計遞迴函式值的逆過程。

動態規劃解題的一般思路:

1.將原問題分解為子問題

把原問題分解為若干子問題,子問題和原問題形式相同或類似,只不過是規模變小了,子問題都解決,原問題即解決(數字三角形例)

子問題的解一旦求出就會被儲存,所以美國子問題只需要解一次

2.確定狀態

在用動態規劃解題時,我們往往將和子問題相關的各個變數的一組取值,稱之為乙個「狀態」。乙個「狀態」對應於乙個或多個子問題,所謂某個「狀態」下的「值」,就是這個「狀態」所對應的子問題的解

所有「狀態」的集合,構成問題的「狀態空間」。「狀態空間」到大小,與用動態規劃解決問題的時間複雜度直接相關。在數字三角形的例子裡,一共有n*(n+1)/2個數字,所有這個問題的狀態空間裡一共就有n*(n+1)/2個狀態

整個問題的時間複雜度是狀態數目乘以計算每個狀態所需要時間

在數字三角形裡每個「狀態」只需要經過一次,且在每個狀態上作計算所花的時間都是和n無關的常數

用動態規劃解題,經常碰到的情況是,k個整數變數能構成乙個狀態(如數字三角形中行號和列號這兩個變數構成「狀態」)。如果這k個整型變數的取值範圍分別是n1,n2......nk,那麼我們就可以用乙個k維的陣列array[n1][n2]......[nk]來儲存各個狀態的「值」。這個「值」未必就是乙個整數或浮點數,可能是需要乙個結構才能表示的,那麼array就可以是乙個結構陣列。乙個「狀態」下的「值」通常會是乙個或多個子問題的解

3.確定一些初始狀態(邊界狀態)的值

以「數字三角形」為例,初始狀態就是底邊數字,值就是底邊數字值

4.確定狀態轉移方程

定義出什麼是「狀態」,以及在該「狀態」下的「值」後,就要找出不同的狀態之間如何遷移——即如何從乙個或多個「值」已知的「狀態」,求出另乙個「狀態」的「值」(「人人為我」遞推型)。狀態的遷移可以用遞迴公式表示,次遞迴公式也可以被稱為「狀態轉移方程」

數字三角形的狀態轉移方程:

maxsum[r][j]=  d[r][j]    r==n

max(maxsum[r+1][j],maxsum[r+1][j+1])+d[r][j] 其他情況

能用動態規劃解決的問題的特點

1)問題具有最優子結構性質

如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質

2)無後效性

當前的若干個狀態值一旦確定,則此後過程的演變就只和這若干狀態的值有關,和之前是採取哪種手段或經過哪條路徑演變到當前的這若干狀態,沒有關係

動態規劃例題總結

uva1025 題意 這個城市有n個車站,每隔一段時間會從所有車站的一遍發出一列列車,有乙個要從第乙個車站出發,目的是在時間t會見車站n 的乙個人,需要換乘,問在不同車站換成所需要等待的最短時間是多少 解法 d i,j 表示在時刻i,你在j車站所需要等待的最長時間,有三種決策,1.等一分鐘 2.搭乘...

動態規劃例題

題目描述 有一條很長的數軸,一開始你在0的位置。接下來你要走n步,第i步你可以往右走ai或者bi。問n步之後,0到m的每個位置,能不能走到?輸入格式 第一行,兩個整數n,m。接下來n行,每行兩個整數ai,bi。輸出格式 一行,一共m 1個數,每個數都是0或1表示能否走到,數字之間不用空格隔開。樣例輸...

《動態規劃》 ACM 動態規劃例題詳解

描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...