(day 39 - 动态规划) 剑指 Offer 47. 礼物的最大价值
题目
题链:剑指 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. 礼物的最大价值相关推荐
- 【LeetCode】剑指 Offer 47. 礼物的最大价值
[LeetCode]剑指 Offer 47. 礼物的最大价值 文章目录 [LeetCode]剑指 Offer 47. 礼物的最大价值 package offer;public class Soluti ...
- 【LeetCode笔记】剑指 Offer 47. 礼物的最大价值(Java、动态规划)
文章目录 题目描述 思路 && 代码 1. 常规动规 O(n2n^2n2) .O(n2n^2n2) 2. 滚动数组法 O(n2n^2n2) .O(nnn) 原地操作O(n2n^2n2) ...
- leetcode剑指 Offer 47. 礼物的最大价值(动态规划)
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘及其上面的礼 ...
- 【千字分析】剑指 Offer 47. 礼物的最大价值
我是小张同学,立志用更简洁的代码做更高效的表达 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格 ...
- 【算法】剑指 Offer 47. 礼物的最大价值
1.概述 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘及 ...
- 牛客网 剑指offer JZ47 礼物的最大价值 Python 动态规划
描述 在一个m\times nm×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定 ...
- 剑指offer之礼物的最大值
题目描述: 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘 ...
- 打牌博弈 dfs深度优先遍历搜索 排课表 拓扑排序 升序字符串 动态规划 剑指offer编程题整理 leetcode每日算法题
递归,回溯, 深度优先搜索 题目描述 有一叠扑克牌,每张牌介于1和10之间 有四种出牌方法: 单出1张 出2张对子 出五张顺子,如12345 出三连对子,如112233 给10个数,表示1-10每种牌 ...
- 剑指Offer:47.求1+2+3+...+n
题目描述 求1+2+3+-+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). //短路法:当n=0时跳出条件语句不再执行递归 p ...
- 【LeetCode】《剑指Offer》第Ⅴ篇⊰⊰⊰ 39 - 47题
[LeetCode]<剑指Offer>第Ⅴ篇⊰⊰⊰ 39 - 47题 文章目录 [LeetCode]<剑指Offer>第Ⅴ篇⊰⊰⊰ 39 - 47题 39. 数组中出现次数超过 ...
最新文章
- 同事说,我写Java代码像写诗
- tkinter学习系列之(五)Checkbutton控件
- 基于Lucene/XML的站内全文检索解决方案:WebLucene 【转】
- YOLOv5的pytorch模型文件转换为ONNX文件
- 第七章 前端开发——前端工程化(NPM、脚手架、前端环境搭建)
- 用css3写遨游的logo
- php 立即释放session 去除其缓存,ThinkPHP关于session无法清除的一个小问题
- 关于oracle数据库的操作的命令
- docker快速入门01——docker安装与简单应用
- 使用vagrant因用户权限导致文件不可写问题的解决
- mysql建立作业_mysql创建作业及问题解决
- 社区团购就是好啊,为何网上那多人去喷呢?
- 从C#程序中调用非受管DLLs
- mac本 安装淘宝镜像
- Java小项目——家庭记账软件
- 1000年---2000年之间的闰年、判断某年是否为闰年
- java进程线程_Java进程线程笔记
- 笔记本电脑屏幕PWM调光频率测试调节软件
- 【QT】C++ GUI Qt4 学习笔记3
- 《机器人学导论》学习-01空间描述与变换
热门文章
- 高性能的MySQL(8)优化服务器配置一安全与稳定
- js基础知识(pomelo阅读)
- linux和windows下,C/C++开发的延时函数,sleep函数
- HP LaserJet P1007 装不到驱动
- [转]ArcGIS.Server.9.3和ArcGIS API for Flex实现GraphicsLayer上画点、线、面(五)
- 关于10月16日数据迁移致网友的致歉信
- display: inline-block;为什么会撑开父div
- 8. 	memached安全性
- python的文件操作os_​Python:目录和文件的操作模块os.path
- js中的onscroll的用法