动态规划算法介绍
文章目錄
- 1 動態規劃算法介紹
- 1.1 引入
- 1.2 動態規劃算法介紹
1 動態規劃算法介紹
1.1 引入
首先看一個問題:一共有n級臺階,每次可以1級或者2級臺階,總共有多少種上法?
啟發性思考:
分治法核心思想: 從上往下分析問題,大問題可以分解為子問題,子問題中還有更小的子問題比如總共有 5 級臺階,求有多少種走法;由于機器人一次可以走兩級臺階,也可以走一級臺階,所以我們可以分成兩個情況:
- 機器人最后一次走了兩級臺階,問題變成了“走上一個 3 級臺階,有多少種走法?”
- 機器人最后一步走了一級臺階,問題變成了“走一個 4 級臺階,有多少種走法?”
我們將求 n 級臺階的共有多少種走法用 f(n) 來表示,則f(n) = f(n-1) + f(n-2);
由上可得 f(5) = f(4) + f(3);
f(4) = f(3) + f(2);
f(3) = f(2) + f(1);
邊界情況分析:
走一步臺階時,只有一種走法,所以 f(1)=1
走兩步臺階時,有兩種走法,直接走 2 個臺階,分兩次每次走 1 個臺階,所以 f(2)=2。
走兩個臺階以上可以分解成上面的情況,這符合我們講解的分治法的思想: 分而治之。
實現代碼如下:
#include <stdio.h> #include <stdlib.h>/*遞歸實現機器人臺階走法統計 參數:n - 臺階個數 返回: 上臺階總的走法 */ int WalkCout(int n){if(n<0) return 0;if(n==1) return 1; //一級臺階,一種走法else if(n==2) return 2; //二級臺階,兩種走法else { //n 級臺階, n-1 個臺階走法 + n-2 個臺階的走法return WalkCout(n-1) + WalkCout(n-2);} }int main(void){for(int i=1; i<=6; i++){printf("%d 臺階共有 %d 種走法\n", i, WalkCout(i)); }system("pause");return 0; }但是,上面的代碼中存在很多重復的計算?
其實我們可以從下向上分析推斷問題:
代碼實現如下:
這就是動態規劃法 !
1.2 動態規劃算法介紹
動態規劃:
也是一種分治思想,但與分治算法不同的是,分治算法是把原問題分解為若干子問題,自頂向下,求解各子問題,合并子問題的解從而得到原問題的解。動態規劃也是自頂向下把原問題分解為若干子問題,不同的是,然后自底向上,先求解最小的子問題,把結果存儲在表格中,在求解大的子問題時,直接從表格中查詢小的子問題的解,避免重復計算,從而提高算法效率。
什么時候要用動態規劃?
如果要求一個問題的最優解(通常是最大值或者最小值),而且該問題能夠分解成若干個子問題,并且小問題之間也存在重疊的子問題,則考慮采用動態規劃。
怎么使用動態規劃?
五步曲解決:
參考資料:
總結
- 上一篇: 分治算法介绍
- 下一篇: 怎么样投资基金才能赚钱 要掌握这些技巧