描述

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

如输入这样的一个二维数组,
[
[1,3,1],
[1,5,1],
[4,2,1]
]

那么路径 1→3→5→2→1 可以拿到最多价值的礼物,价值为12

  • 0<grid.length≤200
  • 0<grid[0].length≤200
示例
// 输入:
[[1,3,1],[1,5,1],[4,2,1]]
// 返回值:
12
解题思路

动态规划

代码实现
/**
 * 动态规划
 *
 * @param grid int整型二维数组
 * @return int整型
 */
func maxValue(grid [][]int) int {
    // n 行,m 列
    n, m := len(grid), len(grid[0])

    for i := 0; i < n; i++ {
        for j := 0; j < m; j++ {
            if i > 0 && j > 0 {
                grid[i][j] += int(math.Max(float64(grid[i-1][j]), float64(grid[i][j-1])))
            } else if i > 0 && j == 0 {
                grid[i][j] += grid[i-1][j]
            } else if i == 0 && j > 0 {
                grid[i][j] += grid[i][j-1]
            }
        }
    }

    return grid[n-1][m-1]
}

本文由 一切随风 创作,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论