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

聊聊筆試必刷的動態(tài)規(guī)劃進(jìn)階題

開發(fā) 后端
定一個(gè)包含非負(fù)整數(shù)的 m x n 網(wǎng)格,請找出一條從左上角到右下角的路徑,使得路徑上的數(shù)字總和為最小,其中 arr[m][n] 表示具體的值。每次只能向下或者向右移動一步。

[[399414]]

本文轉(zhuǎn)載自微信公眾號「Java極客技術(shù)」,作者鴨血粉絲 。轉(zhuǎn)載本文請聯(lián)系Java極客技術(shù)公眾號。

Hello 大家好,我是阿粉,前面有篇文章給大家介紹了動態(tài)規(guī)劃,并通過兩個(gè)案例給大家演示,后臺很多小伙伴也提供了很多建議,沒看過的小伙伴可以去看下什么是動態(tài)規(guī)劃——從青蛙跳臺階開始了解。今天再給大家介紹兩個(gè)案例,幫助大家更好的掌握也順便回顧一下。

案例 1

問:給定一個(gè)包含非負(fù)整數(shù)的 m x n 網(wǎng)格,請找出一條從左上角到右下角的路徑,使得路徑上的數(shù)字總和為最小,其中 arr[m][n] 表示具體的值。每次只能向下或者向右移動一步。這個(gè)問題是上篇文章中的案例的進(jìn)階篇。

思考

根據(jù)上篇文章提供的思路,我們依次進(jìn)行相關(guān)的步驟:

  1. 定義變量:我們定義從左上角走到(i, j) 這個(gè)位置時(shí),最小的路徑和是 dp[i - ][j - 1]。那么,dp[m-1] [n-1] 就是我們要的答案;
  2. 尋找關(guān)系:dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + arr[i][j]; arr[i][j] 表示網(wǎng)格中的數(shù)值,到達(dá)當(dāng)前格子的最小路徑等于左邊或者上邊中較小的路徑加上格子本身的數(shù)值;
  3. 定義初始值:dp[i][0] = dp[i-1][0] + arr[i][0];,dp[0][i] = dp[0][i-1] + arr[0][i];;第一行或者第一列的時(shí)候就是整行和整列的數(shù)值累加。

編碼

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

  1. public int dp(int[][] arr) { 
  2.     int m = arr.length; 
  3.    int n = arr[0].length; 
  4.     if (m <=0 || n <= 0) { 
  5.         return 0; 
  6.     } 
  7.     int[][] dp = new int[m][n]; 
  8.     // 初始化 
  9.    dp[0][0] = arr[0][0]; 
  10.    // 初始化最左邊的列 
  11.    for(int i = 1; i < m; i++){ 
  12.       dp[i][0] = dp[i-1][0] + arr[i][0]; 
  13.     } 
  14.    // 初始化最上邊的行 
  15.    for(int i = 1; i < n; i++){ 
  16.       dp[0][i] = dp[0][i-1] + arr[0][i]; 
  17.     } 
  18.      
  19.     for (int i = 1; i < m; i++) { 
  20.         for (int j = 1; j < n; j++) { 
  21.             dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1]) + arr[i][j]; 
  22.         } 
  23.     } 
  24.     return dp[m - 1][n - 1]; 

解釋下上面的代碼,首先我們創(chuàng)建了一個(gè)二維數(shù)組 dp[m][n],用于記錄到達(dá)位置的最短路徑,由于當(dāng)前的路徑是由左邊或者上邊的最小路徑加上當(dāng)前格子的數(shù)值得到。這里我們需要找到對應(yīng)關(guān)系,也就是dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + arr[i][j],這里我們需要取相鄰的最小值再加上當(dāng)前格子的數(shù)值。

案例 2

問:給定不同面額的硬幣 coins 和一個(gè)總金額 amount。編寫一個(gè)函數(shù)來計(jì)算可以湊成總金額所需的最少的硬幣個(gè)數(shù)。如果沒有任何一種硬幣組合能組成總金額,返回 -1。你可以認(rèn)為每種硬幣的數(shù)量是無限的。Leetcode 322. 零錢兌換。

思考

  1. 定義變量:定義 dp[i] 表示湊成金額i,所需要的最少硬幣個(gè)數(shù),即 dp[amount] 則是我們需要求解的;
  2. 尋找關(guān)系:假設(shè)我們有三種硬幣a,b,c,兌換的金幣數(shù)為 m,我們可以推出 dp[m] = min(dp[m - a], dp[m - b], dp[m - c]) + 1,因?yàn)槿绻覀兪切枰?m 金額的最少硬幣個(gè)數(shù),如果我們求出了 m - a 金額需要的硬幣個(gè)數(shù),在加上一個(gè) a 就可以得到 m,硬幣個(gè)數(shù)只要加 1。其實(shí)b,c 同理。并且我們需要取所有硬幣種類的最小數(shù)。
  3. 定義初始值:dp[0] = 0,沒有金額當(dāng)時(shí)也不需要硬幣個(gè)數(shù),dp[i - coins[j] 需要有解;

編碼

  1. public int dp(int[] coins, int amount) { 
  2.  
  3.         int[] dp = new int[amount + 1]; 
  4.         int size = coins.length; 
  5.         int i = 0; 
  6.         int j = 0; 
  7.      # 定義初始值 
  8.         dp[0] = 0; 
  9.         for (i = 1; i <= amount; i++) { 
  10.             #賦值,當(dāng)不能組合和輸出 -1 判斷使用 
  11.             dp[i] = Integer.MAX_VALUE; 
  12.            # 遍歷 coins 中的硬幣種類 
  13.             for (j = 0; j < size; j++) { 
  14.                 if (i >= coins[j] && (dp[i - coins[j]]) != Integer.MAX_VALUE) { 
  15.                     dp[i] = Math.min(dp[i - coins[j]] + 1, dp[i]); 
  16.                 } 
  17.             } 
  18.         } 
  19.         if (dp[amount] == Integer.MAX_VALUE) { 
  20.             dp[amount] = -1 ; 
  21.         } 
  22.         return dp[amount]; 
  23.     } 

總結(jié)

 

動規(guī)劃的題目在 LeetCode 上面有很多,大家可以根據(jù)上面提供的思路去多刷幾道題,慢慢就會有感覺了,刷完動態(tài)規(guī)劃的題目,相信對大家工作或者找工作肯定有很大的幫助。https://leetcode-cn.com/problemset/all/?topicSlugs=dynamic-programming

 

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2021-12-27 08:22:18

Kafka消費(fèi)模型

2023-10-27 08:59:00

網(wǎng)絡(luò)wiresharkIO

2021-12-09 12:22:28

MyBatis流程面試

2021-12-06 11:03:57

JVM性能調(diào)優(yōu)

2023-12-02 20:41:32

內(nèi)存kube

2023-03-26 09:08:36

2023-06-19 07:31:34

普通動態(tài)規(guī)劃字符串

2025-05-16 09:58:08

2021-01-19 08:25:20

Java反射進(jìn)階

2022-08-29 09:06:43

hippo4j動態(tài)線程池

2018-03-06 11:17:27

互聯(lián)網(wǎng)5G無線電

2020-12-07 06:01:37

Css前端content

2022-10-19 08:19:32

動態(tài)基線預(yù)警

2020-06-02 07:46:30

5G動態(tài)頻譜

2022-06-29 16:37:15

算法JS數(shù)組

2021-10-28 18:58:57

動態(tài)規(guī)劃數(shù)據(jù)結(jié)構(gòu)算法

2022-12-29 08:12:51

動態(tài)規(guī)劃profit

2010-08-18 10:27:56

2021-01-22 05:49:41

數(shù)據(jù)源思路規(guī)劃

2010-08-23 15:11:11

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 精品视频亚洲 | 国产伦一区二区三区视频 | www.99久久.com| 中文字幕日韩欧美 | 国产精品欧美一区二区三区 | 亚洲国产欧美精品 | www.久久国产精品 | 成人av电影网 | 国产成人高清视频 | 欧美黄色一区 | 欧美成年黄网站色视频 | 日韩国产一区二区三区 | 一区二区精品 | 国产一区欧美 | 亚洲视频国产视频 | 免费h在线 | 2021天天躁夜夜看 | 国产精品一区二区av | 日本精品久久 | av中文字幕在线观看 | 操操日 | 久久精品电影 | 亚洲精品电影在线观看 | 欧美亚洲视频 | 日韩欧美福利视频 | 国产欧美精品一区 | 日韩中文一区二区 | 亚洲成人一区二区三区 | 欧美日日 | 久久99视频精品 | 国产视频中文字幕在线观看 | 无吗视频 | 成人毛片视频免费 | 欧美一级片在线观看 | 中文字幕91 | 精品av天堂毛片久久久借种 | 国产一级黄色网 | 欧美日韩大片 | 五月综合久久 | 亚洲精品成人网 | 亚洲精品大全 |