剑指 Offer 47. 礼物的最大价值
题目链接: 剑指 Offer 47. 礼物的最大价值
题目描述:
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。
你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。
给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
解法思路:
本题是一个典型的动态规划的题目,
- 确定dp数组(dp table)以及下标的含义:dp[i][j] 表示走到下标为(i,j)的格子时,礼物的最大价值
- 确定递推公式:dp[i][j] = max(dp[i][j-1],dp[i-1][j]) + grid[i-1][j-1]
- 初始化:数组从1开始,dp数组初始化都是0
- 遍历顺序:i 从 1 到 n, j 从 1 到 m
代码:
// dp[i][j] = max(dp[i][j+1],dp[i+1][j])
func maxValue(grid [][]int) int {
n := len(grid)
if n ==0 {
return 0
}
m := len(grid[0])
dp := make([][]int,n+1)
for i := range dp{
dp[i] = make([]int,m+1)
}
for i:=1;i<=n;i++{
for j:=1;j<=m;j++{
dp[i][j] = max(dp[i][j-1],dp[i-1][j]) + grid[i-1][j-1]
}
}
return dp[n][m]
}
func max(a,b int)int{
if a > b {
return a
}
return b
}