解題一般思路
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標記的作用是 如果乙個點作過推進了,那麼...