题目

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

题解

看到题呢题目说要用动态规划、我用了dfs去解果不其然超时了。

class Solution {private int maxValue = 0;public int maxValue(int[][] grid) {dfs(grid,0,0,0);return maxValue;}void dfs(int[][] grid,int r,int l,int cur){if (r == (grid[0].length-1) && l == (grid.length-1)){if (cur+grid[l][r] > maxValue){maxValue = cur+grid[l][r];return;}}if (r + 1 < grid[0].length){dfs(grid,r+1,l,cur + grid[l][r]);}if (l + 1 < grid.length){dfs(grid,r,l+1,cur + grid[l][r]);}}
}

所以还是要用动态规划的方法去解
因为只有向下或者向右所以设某节点的最大值为dp(i,j),很显然dp(i,j) = max( dp(i-1,j) + dp(i,j-1) ) + grid[i][j],所以可得递推式为f(i,j) = max( f(i-1,j) + dp(i,j-1) ) + grid[i][j]。
特殊情况有不是中间节点的在最顶层或者最右层的。
总的递推式:
i=0,j=0 为开始元素 grid(i,j)
i>0,j=0 为最左边元素 dp[i][j] = dp[i-1][j] + grid[i][j]
i=0,j>0 为最上边元素 dp[i][j] = dp[i][j-1] + grid[i][j]
i>0,j>0 为中间元素 dp[i][j] = max(dp[i][j-1] 、dp[i-1][j]) + grid[i][j]
所以可得代码

class Solution {public int maxValue(int[][] grid) {int r = grid.length,l = grid[0].length;int dp[][] = new int[r][l];for (int i = 0; i < r; i++) {for (int j = 0; j < l; j++) {if (i == 0 && j == 0){ dp[i][j] = grid[i][j]; }else if (i > 0 && j == 0){ dp[i][j] = dp[i-1][j] + grid[i][j];}else if (i == 0 && j > 0){ dp[i][j] = dp[i][j-1] + grid[i][j];}else { dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]) + grid[i][j]; }}}return dp[r-1][l-1];}
}

实际上dp只和dp[i-1][j]、dp[i][j-1]、grid[i][j]有关系、所以可以直接在原数组上操作。就可以将空间复杂度由M*N降为1。

class Solution {public int maxValue(int[][] grid) {int r = grid.length,l = grid[0].length;for (int i = 0; i < r; i++) {for (int j = 0; j < l; j++) {if (i > 0 && j == 0){ grid[i][j] = grid[i-1][j] + grid[i][j];}else if (i == 0 && j > 0){ grid[i][j] = grid[i][j-1] + grid[i][j];}else if (i > 0 && j > 0){ grid[i][j] = Math.max(grid[i-1][j],grid[i][j-1]) + grid[i][j]; }}}return grid[r-1][l-1];}
}

(day 39 - 动态规划) 剑指 Offer 47. 礼物的最大价值相关推荐

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

    [LeetCode]剑指 Offer 47. 礼物的最大价值 文章目录 [LeetCode]剑指 Offer 47. 礼物的最大价值 package offer;public class Soluti ...

  2. 【LeetCode笔记】剑指 Offer 47. 礼物的最大价值(Java、动态规划)

    文章目录 题目描述 思路 && 代码 1. 常规动规 O(n2n^2n2) .O(n2n^2n2) 2. 滚动数组法 O(n2n^2n2) .O(nnn) 原地操作O(n2n^2n2) ...

  3. leetcode剑指 Offer 47. 礼物的最大价值(动态规划)

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

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

    我是小张同学,立志用更简洁的代码做更高效的表达 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格 ...

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

    1.概述 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘及 ...

  6. 牛客网 剑指offer JZ47 礼物的最大价值 Python 动态规划

    描述 在一个m\times nm×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定 ...

  7. 剑指offer之礼物的最大值

    题目描述: 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘 ...

  8. 打牌博弈 dfs深度优先遍历搜索 排课表 拓扑排序 升序字符串 动态规划 剑指offer编程题整理 leetcode每日算法题

    递归,回溯, 深度优先搜索 题目描述 有一叠扑克牌,每张牌介于1和10之间 有四种出牌方法: 单出1张 出2张对子 出五张顺子,如12345 出三连对子,如112233 给10个数,表示1-10每种牌 ...

  9. 剑指Offer:47.求1+2+3+...+n

    题目描述 求1+2+3+-+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). //短路法:当n=0时跳出条件语句不再执行递归 p ...

  10. 【LeetCode】《剑指Offer》第Ⅴ篇⊰⊰⊰ 39 - 47题

    [LeetCode]<剑指Offer>第Ⅴ篇⊰⊰⊰ 39 - 47题 文章目录 [LeetCode]<剑指Offer>第Ⅴ篇⊰⊰⊰ 39 - 47题 39. 数组中出现次数超过 ...

最新文章

  1. 同事说,我写Java代码像写诗
  2. tkinter学习系列之(五)Checkbutton控件
  3. 基于Lucene/XML的站内全文检索解决方案:WebLucene 【转】
  4. YOLOv5的pytorch模型文件转换为ONNX文件
  5. 第七章 前端开发——前端工程化(NPM、脚手架、前端环境搭建)
  6. 用css3写遨游的logo
  7. php 立即释放session 去除其缓存,ThinkPHP关于session无法清除的一个小问题
  8. 关于oracle数据库的操作的命令
  9. docker快速入门01——docker安装与简单应用
  10. 使用vagrant因用户权限导致文件不可写问题的解决
  11. mysql建立作业_mysql创建作业及问题解决
  12. 社区团购就是好啊,为何网上那多人去喷呢?
  13. 从C#程序中调用非受管DLLs
  14. mac本 安装淘宝镜像
  15. Java小项目——家庭记账软件
  16. 1000年---2000年之间的闰年、判断某年是否为闰年
  17. java进程线程_Java进程线程笔记
  18. 笔记本电脑屏幕PWM调光频率测试调节软件
  19. 【QT】C++ GUI Qt4 学习笔记3
  20. 《机器人学导论》学习-01空间描述与变换

热门文章

  1. 高性能的MySQL(8)优化服务器配置一安全与稳定
  2. js基础知识(pomelo阅读)
  3. linux和windows下,C/C++开发的延时函数,sleep函数
  4. HP LaserJet P1007 装不到驱动
  5. [转]ArcGIS.Server.9.3和ArcGIS API for Flex实现GraphicsLayer上画点、线、面(五)
  6. 关于10月16日数据迁移致网友的致歉信
  7. display: inline-block;为什么会撑开父div
  8. 8. memached安全性
  9. python的文件操作os_​Python:目录和文件的操作模块os.path
  10. js中的onscroll的用法