LeetCode·每日一题·剑指 Offer 47. 礼物的最大价值·动态规划

该文章是关于在给定的二维数组中找到最大值路径的问题,提供了动态规划和递归两种解法。动态规划从初始位置开始,通过每次选择上一步的最大值更新当前位置的最大值。递归策略同样是从第一行和第一列开始,递归计算其余位置的最大值。最后返回整个网格中的最大值。
摘要由CSDN通过智能技术生成

作者:小迅

链接:https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/solutions/2154458/dong-tai-gui-hua-zhu-shi-chao-ji-xiang-x-snbm/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目

思路

题意 -> 在给定二维数组中,取最大值路径,并返回最大值

对于最值问题 -> 优先使用动态规划 -> 对于动态规划的题目也可以使用递归

因此本题存在两种方法:

  • 动态规划:

  • 含义:dp[i][j] 表示的含义为 (i,j) 坐标的最大值

  • 初始化:那么对于 (0,0)位置,dp[0][0] = grid[0][0]。

  • 递推公式:那么动态规划递推公式怎么表示呢? 当前位置的大小,取决于从那一步过来,因此每次选择上一步时选择最大值即可 -> dp[i][j] += MAX(dp[i-1][j], dp[i][j-1]);

  • 递推方向:由于当前位置的大小取决于上一次的大小情况,所以需要从头开始递推

由于 dp[i][j] 的 状态只由 dp[i-1][j], dp[i][j-1] 影响,因此可以只申请两个变量保存上一次的状态,当然也可以使用grid数组代替dp数组。

  • 递归:

递归其实和动态规划差不多,每次枚举当前位置的时候,选择上一步的最大值,从第一个位置开始递归即可

代码


#define MAX(a, b) ((a) > (b) ? (a) : (b))
int maxValue(int** grid, int gridSize, int* gridColSize){
    int max = grid[0][0];
    for (int j = 1; j < gridColSize[0]; ++j) {//递推第一行
        grid[0][j] += grid[0][j-1];//记录当前位置最大值
        max = MAX(max, grid[0][j]);//保存最大值
    }
    for (int i = 1; i < gridSize; ++i) {//递推第一列
        grid[i][0] += grid[i-1][0];//记录当前位置最大值
        max = MAX(max, grid[i][0]);//保存最大值
    }
    for (int i = 1; i < gridSize; ++i) {//递归取余位置
        for (int j = 1; j < gridColSize[0]; ++j) {
            grid[i][j] += MAX(grid[i-1][j], grid[i][j-1]);//记录当前位置最大值
            max = MAX(max, grid[i][j]);//保存最大值
        }
    }
    return max;
}

作者:小迅
链接:https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/solutions/2154458/dong-tai-gui-hua-zhu-shi-chao-ji-xiang-x-snbm/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值