剑指 Offer 47. 礼物的最大价值

题目链接: 剑指 Offer 47. 礼物的最大价值

题目描述:

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。
你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。
给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

解法思路:

本题是一个典型的动态规划的题目,

  1. 确定dp数组(dp table)以及下标的含义:dp[i][j] 表示走到下标为(i,j)的格子时,礼物的最大价值
  2. 确定递推公式:dp[i][j] = max(dp[i][j-1],dp[i-1][j]) + grid[i-1][j-1]
  3. 初始化:数组从1开始,dp数组初始化都是0
  4. 遍历顺序: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
}
posted @ 2023-09-07 18:26  小星code  阅读(11)  评论(0)    收藏  举报