当前位置: 首页 > news >正文

2.3 路径问题专题:剑指 Offer 47. 礼物的最大价值

动态规划解决剑指 Offer 47题:礼物的最大价值

1. 题目链接

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

2. 题目描述

在一个 m x n 的棋盘的每一格都放有一个礼物(价值非负),从棋盘的左上角出发,每次向右或向下移动一格,直到到达右下角。给定一个棋盘,计算从起点到终点所能拿到的礼物价值的最大总和。

示例

  • 输入:
    [ [1,3,1], [1,5,1], [4,2,1] ]
  • 输出:12
  • 解释:最优路径为 右 → 右 → 下 → 下,总和为 1 + 3 + 5 + 2 + 1 = 12

3. 示例分析

以示例输入为例:

  1. 起点 (0,0) 的值为 1,下一步可以选择向右到 (0,1) 或向下到 (1,0)
  2. 动态规划表 dp 会记录每个位置的最大累计值。
  3. 最终 dp[3][3](对应棋盘右下角)的值为 12,即最优路径的总和。

4. 算法思路

动态规划状态定义

  • 定义 dp[i][j] 表示从起点 (0,0) 到达棋盘位置 (i-1, j-1) 的最大累计价值(索引从 1 开始以避免越界)。

状态转移方程

  • 每个位置的最大价值等于其左侧或上侧的最大值加上当前格子的价值:
    dp[i][j] = frame[i-1][j-1] + max(dp[i-1][j], dp[i][j-1])

初始化技巧

  • 由于棋盘起点为 (0,0),对应的 dp[1][1] 初始化为 frame[0][0]。通过将 dp 数组的维度设为 (m+1) x (n+1),并隐式初始化为 0,避免了显式处理边界条件。

5. 边界条件与注意事项

  1. 空输入处理:若棋盘为空(m=0n=0),需返回 0(代码中未显式处理,实际应用需补充)。
  2. 单行或单列棋盘:路径唯一,直接累加所有值即可。
  3. 负价值场景:题目假设礼物价值非负,若允许负值需考虑路径选择逻辑是否变化。

6. 代码实现

class Solution {
public:
    int jewelleryValue(vector<vector<int>>& frame) {
        int m = frame.size(), n = frame[0].size();
        // 处理空输入的特殊情况
        if (m == 0 || n == 0) return 0;

        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
        
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                dp[i][j] = frame[i-1][j-1] + max(dp[i-1][j], dp[i][j-1]);
            }
        }
        
        return dp[m][n];
    }
};

代码解析

  1. 输入检查:添加了对空棋盘的处理,避免访问非法内存。
  2. 动态规划表填充:双重循环遍历每个位置,通过 max 函数选择左侧或上侧的最大路径值。
  3. 返回值dp[m][n] 对应棋盘右下角的最大累计价值。

时间复杂度O(mn),需遍历整个棋盘。
空间复杂度O(mn),动态规划表的空间开销。

通过动态规划逐格递推,代码简洁且高效,完美解决了棋盘最大路径和问题。

http://www.dtcms.com/a/109011.html

相关文章:

  • Apollo配置中心登陆页面添加验证码
  • OpenCV销毁窗口
  • 浅谈软件成分分析 (SCA) 在企业开发安全建设中的落地思路
  • 数据库--SQL
  • Pytorch深度学习框架60天进阶学习计划 - 第34天:自动化模型调优
  • 维拉工时自定义字段:赋能项目数据的深度洞察 | 上新预告
  • React-router v7 第一章(安装)
  • JDBC常用的接口
  • coding ability 展开第八幕(位运算——基础篇)超详细!!!!
  • Spring Boot 集成 Redis 对哈希数据的详细操作示例,涵盖不同结构类型(基础类型、对象、嵌套结构)的完整代码及注释
  • PyQt6实例_A股日数据维护工具_使用
  • OpenCV 引擎:驱动实时应用开发的科技狂飙
  • 操作系统(一):概念及主流系统全分析
  • 大模型学习三:DeepSeek R1蒸馏模型组ollama调用流程
  • Vue2 生命周期
  • Adam vs SGD vs RMSProp:PyTorch优化器选择
  • 美关税加征下,Odoo免费开源ERP如何助企业破局?
  • 【无标题 langsmith
  • DNS域名解析过程 + 安全 / 性能优化方向
  • 在线下载国内外各种常见视频网站视频的网页端工具
  • frp 让服务器远程调用本地的服务(比如你的java 8080项目)
  • AIGC7——AIGC驱动的视听内容定制化革命:从Sora到商业化落地
  • S3C2410 的总线架构
  • OpenCV 图形API(11)对图像进行掩码操作的函数mask()
  • RK3568 gpio模拟i2c 配置hym8563 RTC时钟
  • 19c21c单机/RAC手工清理标准化文档
  • 中小企业数字化转型的本质:在Websoft9应用平台上实现开源工具与商业软件的统一
  • GitHub 趋势日报 (2025年04月02日)
  • 《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》第2章 Java内存区域与内存溢出异常
  • springboot 启动方式 装配流程 自定义starter 文件加载顺序 常见设计模式