動態規劃的例題以及一般思路

2021-10-23 03:14:28 字數 2186 閱讀 4128

解題一般思路

1.利用遞迴思想設計遞迴

2.利用記憶化遞迴儲存

3.確定狀態,寫出狀態轉移方程

4.遞迴轉遞推

例題:

在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得

路徑,上所經過的數字之和最大。路徑,上的每一步都只能往左下或

右下走。只需要求出這個最大和即可,不必給出具體路徑。

輸入n

輸出值最大的路線的和

記憶化遞迴

#include

#include

using

namespace std;

int r[

100]

[100];

int rmax[

100]

[100];

intf

(int i,

int k,

int n)

//先寫出原始遞迴 在寫出記憶化遞迴

if(i == n)

int x =

f(i +

1, k, n)

;int y =

f(i +

1, k+

1, n)

; rmax[i +1]

[k]= x;

rmax[i +1]

[k+1

]= y;

return

max(x, y)

+ r[i]

[k];

}int

main()

} cout <

1,1, n)

;}

遞迴轉遞推

#include

#include

using

namespace std;

int r[

100]

[100];

int rmax[

100]

[100];

intmain()

//遞迴轉遞推

}for

(int i = n-

1; i >=

1; i--)}

cout << r[1]

[1];

}

放蘋果 --動態規劃

每一步有兩種情況

1.有空盤子的 2.沒空盤子(即放滿)

狀態轉移方程f[i][j] = f[i-j][j] + f[i][j - 1]

i把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用k表示)5,1,1和1,5,1 是同一種分法。

input

第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數m和n,以空格分開。1<=m,n<=10。

output

對輸入的每組資料m和n,用一行輸出相應的k。

sample input

17 3

sample output

8

#include

using

namespace std ;

// n個蘋果 m個盤子 return f(n - m, m) +f(n, m-1);

intmain()

int f[

100]

[100]=

; f[0]

[1]=

1;f[0]

[0]=

1;f[1]

[0]=

0;f[1]

[1]=

1;for(

int i =

0; i < n; i++

)for

(int i =

0; i < m; i++

)for

(int i =

1; i <= n; i++

)else}}

cout <

[m];

}

動態規劃解題一般思路

摘自mooc的程式設計與演算法 一.遞迴到動規的轉換方法 遞迴函式有n個引數,就定義乙個n維的陣列,陣列的下標就是遞迴函式引數的取值範圍,陣列元素的值就是遞迴的返回值,這樣就可以從邊界值開始逐步填充陣列,相當於計算遞迴函式值的逆過程 二.動態規劃解題一般思路 1.將原問題分解成子問題 把原問題分解成...

動態規劃解題的一般思路

遞迴到動規的一般轉化方法 遞迴函式有n個引數,就定義乙個n維的陣列,陣列的下表是遞迴函式引數的取值範圍,陣列元素的值是遞迴函式的返回值,這樣就可以從邊界值開始,逐步填充陣列,相當於計算遞迴函式值的逆過程 動規解題的一般思路 1.將原問題分解為子問題 把原問題分解為若干個子問題,子問題和原問題形式相同...

動態規劃的一般描述

一,粗獷的動態規劃演算法 st加入list for z 1 to n 推進n次,n為dag頂點數 else 二,帶open標記的動態規劃演算法 st.open true st加入list for z 1 to n 推進n次,n為dag頂點數 else open標記的作用是 如果乙個點作過推進了,那麼...