Re: [閒聊] 每日leetcode

作者: JIWP (JIWP)   2025-08-07 23:53:08
3363. Find the Maximum Number of Fruits Collected
今天賭博輸錢, 只好寫每日文來騙一點p幣
思路:
根據題目說的每一個人都會在n-1步的時候抵達終點
那在(0,0)的那個人就只能往對角線走, 所以先把對角線的水果拿走, 並計算總和
再來是在(0,n-1)跟(n-1,0)的人, 他們行走的範圍也是有限制
知道這一點後
基本上就是用dp去計算就好了
golang code :
func maxCollectedFruits(fruits [][]int) int {
n := len(fruits)
ans := 0
dpGet := func(dp [][]int, i, j int) int {
if j >= 0 && j < len(dp[i]) {
return dp[i][j]
}
return 0
}
for i := 0; i < n; i++ {
ans += fruits[i][i]
fruits[i][i] = 0
}
dp1, dp2 := make([][]int, n), make([][]int, n)
dp1[0], dp2[0] = []int{fruits[0][n-1]}, []int{fruits[n-1][0]}
for i := 1; i < n/2; i++ {
dp1[i], dp2[i] = make([]int, i+1), make([]int, i+1)
for j := 0; j <= i; j++ {
dp1[i][j] = fruits[i][n-1-j] + max(dpGet(dp1, i-1, j-1), dpGet(dp1, i-1, j)
, dpGet(dp1, i-1, j+1))
dp2[i][j] = fruits[n-1-j][i] + max(dpGet(dp2, i-1, j-1), dpGet(dp2, i-1, j)
, dpGet(dp2, i-1, j+1))
}
}
if n%2 == 1 {
mid := n / 2
dp1[mid], dp2[mid] = make([]int, mid+1), make([]int, mid+1)
for j := 0; j <= mid; j++ {
dp1[mid][j] = fruits[mid][n-1-j] + max(dpGet(dp1, mid-1, j-1), dpGet(dp1,
mid-1, j), dpGet(dp1, mid-1, j+1))
dp2[mid][j] = fruits[n-1-j][mid] + max(dpGet(dp2, mid-1, j-1), dpGet(dp2,
mid-1, j), dpGet(dp2, mid-1, j+1))
}
}
for i := (n + 1) / 2; i < n; i++ {
size := n - i
dp1[i], dp2[i] = make([]int, size), make([]int, size)
for j := 0; j < size; j++ {
dp1[i][j] = fruits[i][n-1-j] + max(dpGet(dp1, i-1, j-1), dpGet(dp1, i-1, j)
, dpGet(dp1, i-1, j+1))
dp2[i][j] = fruits[n-1-j][i] + max(dpGet(dp2, i-1, j-1), dpGet(dp2, i-1, j)
, dpGet(dp2, i-1, j+1))
}
}
return ans + dp1[n-1][0] + dp2[n-1][0]
}
作者: SecondRun (雨夜琴聲)   2024-08-07 23:53:00
別捲了
作者: aioiwer318 (哀歐)   2025-08-07 23:59:00
別捲了

Links booklink

Contact Us: admin [ a t ] ucptt.com