Re: [閒聊] 每日LeetCode

看板Marginalman作者 (みけねこ的鼻屎)時間3年前 (2022/12/13 11:59), 3年前編輯推噓1(101)
留言2則, 2人參與, 3年前最新討論串135/719 (看更多)
931. Minimum Falling Path Sum 給予一個n*n矩陣,求出自頂到下的最小路徑和,路徑上到下可由座標(x,y)移動到(x+1,y) (x+1,y+1)和(x+1,y-1),對應了中、左、右。 Example : 藍色為最小路徑(可能不唯一) https://assets.leetcode.com/uploads/2021/11/03/failing1-grid.jpg
https://assets.leetcode.com/uploads/2021/11/03/failing2-grid.jpg
思路: 1.找最小路徑問題可以用dfs求解,並用動態規劃優化。 2.任意一個點的最小路徑一定是前三條路徑裡面最小的那一個,狀態轉移方程: dp(i,j) = mat[i,j] + min(dp(i+1,j), dp(i+1,j+1), dp(i+1,j-1)) 3.有動態轉移方程後就可以求dp了,我們初始化最後一行的數值為矩陣值,因為 他的下面沒路可走了。 (因為我是遞迴改過來的所以我從下往上建立dp,由上往下道理差不多。) 4.照動態轉移方程建完dp之後,第一行的值為到達這一個點的最小路徑和,我們只要 再遍歷這一行就能找出最小路徑和了。 Java Code: ----------------------------------- class Solution { public int minFallingPathSum(int[][] matrix) { int n = matrix.length; int[][] dp = new int[n][n]; // 初始化 for (int i = 0; i < n; i++) { dp[n - 1][i] = matrix[n - 1][i]; } for (int r = n - 2; r >= 0; r--) { for (int c = 0; c < n; c++) { if (c == 0) { dp[r][c] = matrix[r][c] + Math.min(dp[r + 1][c], dp[r + 1][c + 1]); } else if (c == n - 1) { dp[r][c] = matrix[r][c] + Math.min(dp[r + 1][c], dp[r + 1][c - 1]); } else { dp[r][c] = matrix[r][c] + Math.min(dp[r + 1][c], Math.min(dp[r + 1][c + 1], dp[r + 1][c - 1])); } } } int min = dp[0][0]; for (int i = 1; i < n; i++) { min = Math.min(min, dp[0][i]); } return min; } } ----------------------------------- -- https://i.imgur.com/sjdGOE3.jpg
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.231.14.41 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1670903974.A.FA5.html ※ 編輯: Rushia (36.231.14.41 臺灣), 12/13/2022 12:01:48

12/13 12:02, 3年前 , 1F
大師
12/13 12:02, 1F

12/13 12:06, 3年前 , 2F
大師
12/13 12:06, 2F
文章代碼(AID): #1Zb_Yc-b (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1Zb_Yc-b (Marginalman)