成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

什么是動態規劃——從青蛙跳臺階開始了解

開發 前端
Hello 大家好,我是阿粉,動態規劃(Dynamic Programming),簡稱 DP 相信大家在日常的工作或者學習的過程中都遇到過這個詞,而且動態規劃也是面試過程中最喜歡被問到的題目,阿粉在經歷的不多的幾場面試中都被問到了,實在是苦不堪言,不過好在阿粉還是有學過的,一些簡單的套路阿粉還是懂的。

[[396723]]

本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲。轉載本文請聯系Java極客技術公眾號。

Hello 大家好,我是阿粉,動態規劃(Dynamic Programming),簡稱 DP 相信大家在日常的工作或者學習的過程中都遇到過這個詞,而且動態規劃也是面試過程中最喜歡被問到的題目,阿粉在經歷的不多的幾場面試中都被問到了,實在是苦不堪言,不過好在阿粉還是有學過的,一些簡單的套路阿粉還是懂的。下面就從一個很多人應該都不陌生的題目講起。

案例 1

問:一只青蛙一次可以跳上 1 級臺階,也可以跳上 2 級,求該青蛙跳上一個 n 級的臺階總共有多少種跳法?

思考

剛開始看到這個題目的時候可能沒什么思路,不過我們可以一點點的想下去,我們假設青蛙跳上一個 n 級的臺階總共有多少種跳法 f(n)種跳法,那當 n = 0 時,f(0) = 0,沒有臺階當然沒有跳法。n = 1,f(1) = 1;只有一個臺階的時候,只能跳 1 個;n = 2,f(2) = 2,當有兩個臺階的時候,可以有 2 種跳法,一個一個跳和一下跳 2 個,那如果我們有三個臺階的話,是不是將一個臺階和兩個臺階的總和加起來就可以了呢?所以我們就可以想到 f(3) = f(2) + f(1),所以我們能推導出 f(n) = f(n - 1) + f(n - 2);

編碼

上面的分析可以想到,那么接下來我們就需要用代碼來實現了,對于需要使用到之前的記錄,我們可以考慮用一維數組來記錄,所以就有了下面的這段代碼。

  1. public int dp(int n) { 
  2.     if (n <= 0) { 
  3.         return 0; 
  4.     } 
  5.     int[] dp = new int[n + 1]; 
  6.     dp[0] = 0; 
  7.     dp[1] = 1; 
  8.     dp[2] = 2; 
  9.    // 之所以要從 3 開始,是因為 2 不符合下面的規則 
  10.     for (int i = 3; i <= n; i++) { 
  11.         dp[i] = dp[i - 1] + dp[i - 2]; 
  12.     } 
  13.     return dp[n]; 

解釋下上面的代碼,首先我們創建了一個一維數組 dp,用于記錄每個臺階有的跳法,然后從索引三開始遍歷,運用公式f(n) = f(n - 1) + f(n - 2); 進行賦值,結果直接輸出 dp[n] 對應的數值即可。

分析

通過上面的案例,我們思考一下對于動態規劃的題目我們需要怎么做,我們一開始定義了 n 級臺階有 f(n) 種跳法,然后通過模擬的方式計算出f(0),f(1),f(2),接著我們找到了 f(n) = f(n - 1) + f(n - 2); 的關系。按照這種思路我們可以總結出三個步驟,分別是

  1. 定義變量:把已知的和需要求解的,定義出變量,如上面的 n 和 f(n);
  2. 尋找表達式:找到 f(n) 和 f(n - 1) 以及 f(n - 2),等情況的表達式,如上面的 f(n) = f(n - 1) + f(n - 2),這一步往往是最難的;
  3. 尋找初始值:確保找到所有的臨界條件,如上面的 f(0) = 0, f(1) = 1, f(2) = 2;

上面的步驟是通用步驟,往往在第一步的時候我們設置的 f(n) 是一個數組,根據具體的場景可能是一維數組也有可能是二維數組,上面的例子我們定義的就是一維數組,而且往往我們需要求解什么就定義什么數組。

下面我們通過這種方式再看一道 LeetCode 的原題

案例 2

問:一個機器人位于一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。問總共有多少條不同的路徑?

img

根據上面的三個步驟,我們依次來解決,既然是 m x n 的網格,很顯然我們需要用二維數組來解決問題,所以我們

  1. 定義 d[m][n] 表示在 m x n 網格上移到右下角需要的總步數;
  2. 因為機器人只能向右和向下移動,所以到達下一個格子只能是從左邊或者上面,所以達到 m x n 的步數等于(m - 1) x n + m x (n - 1),也就是 d[m][n] = d[m - 1][n] + d[m][n - 1];
  3. 定義初始值d[0][n] = 1,d[n][0] = 1,也就是只有一行或者一列的時候只有一種方法,全部向下或者向右移動;

編碼

  1. public int dp(int m, int n) { 
  2.     if (m <=0 || n <= 0) { 
  3.         return 0; 
  4.     } 
  5.     int[][] dp = new int[m][n]; 
  6.     //只有一列的時候 
  7.     for (int i = 0; i < m; i++) { 
  8.         d[i][0] = 1; 
  9.     } 
  10.     //只有一行的時候 
  11.      for (int i = 0; i < n; i++) { 
  12.         d[0][i] = 1; 
  13.     } 
  14.     
  15.     for (int i = 1; i < m; i++) { 
  16.         for (int j = 1; j < n; j++) { 
  17.             d[i][j] = d[i][j - 1] + d[i - 1][j]; 
  18.         } 
  19.     } 
  20.     //數組的下標從 0 開始 
  21.     return d[m - 1][n - 1]; 

通過上面的三個步驟,我們可以完美的解決問題,動態規劃的問題難點就在于找尋規律和初始值,有點時候如果我們找不到規律就沒辦法了,而且如果初始值找的不完全也會有問題,這個只能多多練習了。

總結

 

動規劃的題目在 LeetCode 上面有很多,大家可以根據上面提供的思路去多刷幾道題,慢慢就會有感覺了,刷完動態規劃的題目,相信對大家工作或者找工作肯定有很大的幫助。

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2022-06-27 19:19:26

算法題青蛙跳臺階

2021-07-27 05:21:34

邊緣計算數據網絡

2021-01-04 08:37:53

動態規劃DP

2021-02-09 09:55:24

動態規劃

2009-12-31 15:07:13

2021-01-19 05:46:45

背包數組容量

2023-09-03 22:35:02

2019-06-11 08:40:30

物聯網IOT技術

2024-06-21 14:21:11

2025-04-02 08:00:00

Agent智能人工智能

2021-07-09 06:48:29

數組存儲內存

2025-05-29 08:00:00

數組編程語言

2020-12-22 21:23:54

物聯網設備物聯網IOT

2023-11-06 07:23:06

API開發生態系統

2009-07-23 13:47:28

2013-08-06 10:50:52

千兆WiFi802.11ac5G WiFi

2025-05-22 01:00:00

2018-04-18 07:01:59

Docker容器虛擬機

2020-07-02 15:32:23

Kubernetes容器架構

2010-09-26 14:57:05

SQL聯合查詢
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 激情网站在线观看 | 亚洲国产一区二区视频 | 久久久久久av | 国产成人99久久亚洲综合精品 | 亚洲精品一区二区三区蜜桃久 | 青青艹在线视频 | 亚洲性网| 国产成人免费视频网站高清观看视频 | 欧美一区二区三区久久精品 | 欧美综合久久久 | 一区二区视频在线 | 中文字幕在线观看www | 久久福利电影 | 欧美午夜在线 | 精品区 | 在线一区视频 | 国产高清视频在线播放 | 国产精品2 | 久久久久久国产精品 | 久久伦理中文字幕 | www免费视频| 亚洲综合婷婷 | 国产精品一区二区免费 | 香蕉久久网 | 精品久久久久久久久久久久久久久久久 | 97视频在线免费 | 欧美一级片在线观看 | 中文在线观看视频 | 中文字幕成人在线 | 亚洲国产aⅴ精品一区二区 免费观看av | 天天玩夜夜操 | 欧美日韩视频在线 | 黄视频免费观看 | 黄色一级大片在线免费看产 | 高清视频一区二区三区 | 日韩一区在线播放 | 国产日韩一区 | 性高朝久久久久久久3小时 av一区二区三区四区 | 成人精品啪啪欧美成 | 免费观看一区二区三区毛片 | 人人做人人澡人人爽欧美 |