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

Posted aaaaaaaWoLan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 47. 礼物的最大价值相关的知识,希望对你有一定的参考价值。

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

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

示例 1:

输入: 
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 12
解释: 路径 13521 可以拿到最多价值的礼物

**思路:**遍历礼物方格,对所在位置左边和上面较大的值进行相加,最后一直到方格最后一个就是最大价值。有三种情况需要特殊考虑:

  • 第一个方格:直接continue跳过即可
  • 第一列方格:无法访问左边位置的内容,只需要加上自己上面的元素即可
  • 第一行方格:无法访问上面位置的内容,只需要加上自己左边的元素即可

以下以数组arr

[
  [1,3,2,5],
  [1,4,1,2],
  [2,3,2,1],
  [1,2,5,4]
]

为例:

一开始是arr[0] [0],直接continue跳过

然后是arr[0] [1],也就是3,这是第一行元素,所以直接加上自己左边的数即可

arr[0] [2],也就是2,同样也是第一行元素,直接加上左边的数

arr[0] [3],也就是5,第一行元素,直接加上左边的数

接下来就是arr[1] [0] 即1,1是第一列元素,直接加上自己上面的元素即可

然后是arr[1] [1],也就是4,既不属于第一行元素也不属于第一列元素,加上自己左边、上面中较大的元素即可,也就是加上位于自己上面的4

arr[1] [2],也就是1,左边的8大于上面的6,加上位于自己左边的8即可

arr[1] [3],也就是2,上面的11大于左边的9,加上位于自己上面的11即可

arr[2] [0],也就是2,属于第一列元素,直接加上位于自己上面的2即可

arr[2] [1],也就是3,上面的8大于左边的4,加上上面的8即可

arr[2] [2],也就是2,左边的11大于上面的9,加上左边的11即可

arr[2] [3],也就是1,左边和上面都为13,取一个相加就行

arr[3] [0],也就是1,属于第一列元素,加上自己上面的元素即可

arr[3] [1],也就是2,上面的11大于左边的5,加上上面的11即可

arr[3] [2],也就是5,左边和上面的元素相等,取一个相加即可

arr[3] [3]。也就是4,左边的18大于上面的14,加上左边的18即可

所以最终答案就是22,返回grid[gridSize-1] [*gridColSize - 1]就可以了

代码:

int maxValue(int** grid, int gridSize, int* gridColSize){
    int i = 0;
    int j = 0;

    for (i = 0; i < gridSize; i++)
    {
        for (j = 0; j < *gridColSize; j++)
        {
            if (i == 0 && j == 0)
            continue;

            if(i == 0)//第一行单独考虑
            {
                grid[i][j] = grid[i][j] + grid[i][j - 1];
            }
            else if (j == 0)//第一列单独考虑
            {
                grid[i][j] = grid[i][j] + grid[i - 1][j];
            }
            else
            {
                grid[i][j] = grid[i][j] + fmax(grid[i - 1][j], grid[i][j - 1]);
            }
        }
    }

    return grid[gridSize - 1][*gridColSize - 1];
}

以上是关于剑指 Offer 47. 礼物的最大价值的主要内容,如果未能解决你的问题,请参考以下文章

千字分析剑指 Offer 47. 礼物的最大价值

千字分析剑指 Offer 47. 礼物的最大价值

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

LeetCode(剑指 Offer)- 47. 礼物的最大价值

LeetCode(剑指 Offer)- 47. 礼物的最大价值

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