leetcodeF47 礼物的最大价值
* @Description 从左上角开始移动,每次移动可以向右也可以向下
* 问题本身自带状态转移关系,下一步状态基于上一步位置
* 建立缓存时以位置为坐标,G(x,y) 表示从 x/y 坐标开始行动可以获取的最大价值
* 因为有最大的含义, x/y 坐标可以唯一的确定 从本位置开始移动可获得的最大价值,以这两个坐标建立的缓存是有效的
* 那么尝试定义状态转移方程:
* G(x,y) = max{ G(x-1,y) , G(x,y-1) } + grid[x][y]
* x,y 只能从 x-1,y 及 x,y-1 转移过来,该转移过程可以完整覆盖解空间
* 当 x<0 或者 y<0 时以 0 回归,代表无价值
public int maxValue(int[][] grid) { int[][] cache = new int[grid.length+1][grid[0].length+1]; return maxValue(grid, grid.length - 1, grid[0].length - 1, cache); } /** * @Author Nxy * @Date 2020/5/16 23:56 * @Description 从左上角开始移动,每次移动可以向右也可以向下 * 问题本身自带状态转移关系,下一步状态基于上一步位置 * 建立缓存时以位置为坐标,G(x,y) 表示从 x/y 坐标开始行动可以获取的最大价值 * 因为有最大的含义, x/y 坐标可以唯一的确定 从本位置开始移动可获得的最大价值,以这两个坐标建立的缓存是有效的 * 那么尝试定义状态转移方程: * G(x,y) = max{ G(x-1,y) , G(x,y-1) } + grid[x][y] * x,y 只能从 x-1,y 及 x,y-1 转移过来,该转移过程可以完整覆盖解空间 * 当 x<0 或者 y<0 时以 0 回归,代表无价值 */ public int maxValue(int[][] grid, int x, int y, int[][] cache) { if (x < 0 || y < 0) { return 0; } if (cache[x][y] != 0) { return cache[x][y]; } int re = Math.max(maxValue(grid, x - 1, y, cache), maxValue(grid, x, y - 1, cache)) + grid[x][y]; cache[x][y] = re; return re; }
效率:
当你看清人们的真相,于是你知道了,你可以忍受孤独
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构