剑指 Offer 47. 礼物的最大价值
Posted aaaaaaaWoLan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 47. 礼物的最大价值相关的知识,希望对你有一定的参考价值。
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
示例 1:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物
**思路:**遍历礼物方格,对所在位置左边和上面较大的值进行相加,最后一直到方格最后一个就是最大价值。有三种情况需要特殊考虑:
- 第一个方格:直接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. 礼物的最大价值的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode(剑指 Offer)- 47. 礼物的最大价值