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

20 篇文章 2 订阅

剑指 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]
]

image-20210817222347918

为例:

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

image-20210817222514376

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

image-20210817222618366

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

image-20210817222727463

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

image-20210817222801755

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

image-20210817222919632

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

image-20210817223040534

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

image-20210817223146280

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

image-20210817223238937

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

image-20210817223314872

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

image-20210817223358388

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

image-20210817223527424

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

image-20210817223533356

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

image-20210817223631281

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

image-20210817223720442

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

image-20210817223728217

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

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

image-20210817224119708

代码:

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];
}
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WoLannnnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值