日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划算法介绍

發布時間:2025/4/5 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划算法介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 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; }

但是,上面的代碼中存在很多重復的計算?

其實我們可以從下向上分析推斷問題:

代碼實現如下:

#include <stdio.h> #include <stdlib.h>int WalkCount2(int n) {int ret = 0;//無意義的情況if(n <= 0)return 0;if(n == 1)return 1;if(n == 2)return 2;//數組用于存儲走 n 個臺階的走法數int* value = new int[n + 1];value[0] = 0;value[1] = 1;value[2] = 2;for(int i = 3; i <= n; i++) {value[i] = value[i - 1] + value[i - 2];}ret = value[n];delete value;return ret; }int main(void){for(int i=1; i<=6; i++){printf("%d 臺階共有 %d 種走法\n", i, WalkCount2(i));}system("pause");return 0; }

這就是動態規劃法 !

1.2 動態規劃算法介紹

動態規劃:
也是一種分治思想,但與分治算法不同的是,分治算法是把原問題分解為若干子問題,自頂向下,求解各子問題,合并子問題的解從而得到原問題的解。動態規劃也是自頂向下把原問題分解為若干子問題,不同的是,然后自底向上,先求解最小的子問題,把結果存儲在表格中,在求解大的子問題時,直接從表格中查詢小的子問題的解,避免重復計算,從而提高算法效率。

什么時候要用動態規劃?
如果要求一個問題的最優解(通常是最大值或者最小值),而且該問題能夠分解成若干個子問題,并且小問題之間也存在重疊的子問題,則考慮采用動態規劃。

怎么使用動態規劃?
五步曲解決:

  • 判題題意是否為找出一個問題的最優解。
  • 從上往下分析問題,大問題可以分解為子問題,子問題中還有更小的子問題。
  • 從下往上分析問題 ,找出這些問題之間的關聯(狀態轉移方程)。
  • 討論底層的邊界問題。
  • 解決問題(通常使用數組進行迭代求出最優解)。

  • 參考資料:

  • C/C++從入門到精通-高級程序員之路【奇牛學院】
  • 總結

    以上是生活随笔為你收集整理的动态规划算法介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。