Re: [閒聊] 每日LeetCode

看板Marginalman作者 (神楽めあ的錢包)時間1年前 (2024/02/11 17:42), 編輯推噓1(102)
留言3則, 3人參與, 1年前最新討論串670/719 (看更多)
1463 Cherry Pickup II 給一個2維矩陣grid,grid[i][j]代表這個格子的櫻桃數量 有兩個機器人會收集格子上的櫻桃 當兩個機器人走到同一格的時候,只有一個機器人可以拿grid[i][j]個櫻桃,另一個拿0個 機器人一個是從左上角grid[0][0],另一個是從右上角grid[0][cols-1] 每次可以往左下、正下、右下走 請問機器人最多可以收集幾個櫻桃 思路: 建立一個3維dp矩陣 dp[i][j][k]代表第i列,機器人1拿j列,機器人2拿k列的最大數目 機器人1走到[i][j]有3種走法 [i-1][j-1]、[i-1][j]、[i-1][j+1] 同理機器人2走到[i][k]也有三種走法 [i-1][k-1]、[i-1][k]、[i-1][k+1] 這樣總共9種組合 dp[i][j][k]=這9種組合最大的+grid[i][j]+grid[i][k] 最後返回dp[n-1]裡最大的數字就好 Go code var m int func cherryPickup(grid [][]int) int { n := len(grid) m = len(grid[0]) dp1 := [70][70]int{} dp2 := [70][70]int{} dp1[0][m-1] = grid[0][0] + grid[0][m-1] for i := 1; i < n; i++ { for j := 0; j <=min(i,m-1); j++ { //j最大會到i但不能超過m for k := m - 1; k >= max(m-1-i, 0); k-- {//k最小可以到n-1-i但不能 小於0 dp2[j][k] = grid[i][j] + grid[i][k] + cal(&dp1, j, k) if j == k { dp2[j][k] -= grid[i][k] } } } dp1=dp2 dp2 = [70][70]int{} } ans := 0 for i := 0; i < m; i++ { for j := 0; j < m; j++ { ans = max(ans, dp1[i][j]) } } return ans } func cal(dp *[70][70]int, x, y int) int { ans := 0 for i := -1; i <= 1; i++ { for j := -1; j <= 1; j++ { if x+i > -1 && x+i < m && y+j > -1 && y+j < m { ans = max(ans, (*dp)[x+i][y+j]) } } } return ans } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.138.223.153 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1707644561.A.EB7.html

02/11 17:49, 1年前 , 1F
到底誰過年還在刷題
02/11 17:49, 1F

02/11 17:52, 1年前 , 2F
你好猛
02/11 17:52, 2F

02/11 17:55, 1年前 , 3F
164p欸 好爽
02/11 17:55, 3F
文章代碼(AID): #1bo9QHwt (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1bo9QHwt (Marginalman)