剑指 Offer 47. 礼物的最大价值 --- 回溯and动规

本文介绍了如何利用动态规划优化解决LeetCode上的‘礼物的最大价值’问题。传统回溯法虽然能够找到答案,但时间复杂度过高。通过动态规划,我们可以将每一格的最优价值存储下来,避免重复计算,从而降低时间复杂度,实现高效求解。
摘要由CSDN通过智能技术生成

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

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
示例 1:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物
提示:
0 < grid.length <= 200
0 < grid[0].length <= 200

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof

回溯法

思路就是把每一条有可能路线的值算出来,然后进行比较,输出最高的。

递归终止条件:

  • i,j 越界
  • i,j 到达右下角(此时路线已经走完,进行最大值比较)

递归方程:

  • 每次向右递归 i+1,并且加上该位置礼物价值
  • 每次向下递归 j+1,并且加上该位置礼物价值
class Solution {
    int max = 0,m,n;
    public int maxValue(int[][] grid) {
        m = grid.length-1;
        n = grid[0].length-1;
        dfs(0, 0, 0, grid);
        return max;
    }
    public void dfs(int i, int j, int tmp, int[][] grid) {
        if (i>m || j>n) return;
        if (i==m && j==n) {
            tmp+=grid[i][j];
            max = Math.max(tmp,max);
            return;
        }
        dfs(i+1, j, tmp+grid[i][j], grid);
        dfs(i, j+1, tmp+grid[i][j], grid);
    }

}

虽然说代码没什么问题,但无奈这个测试用例
在这里插入图片描述
这样递归确实时间复杂度太高了,会超出时间限制

当然有更妙的方法,动态规划

动态规划

在这里插入图片描述
在这里插入图片描述

作者:jyd
链接:https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof/solution/mian-shi-ti-47-li-wu-de-zui-da-jie-zhi-dong-tai-gu/

class Solution {
    public int maxValue(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(i == 0 && j == 0) continue;
                if(i == 0) grid[i][j] += grid[i][j - 1] ;
                else if(j == 0) grid[i][j] += grid[i - 1][j];
                else grid[i][j] += Math.max(grid[i][j - 1], grid[i - 1][j]);
            }
        }
        return grid[m - 1][n - 1];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值