LeetCode 3418.机器人可以获得的最大金币数:动态规划

【LetMeFly】3418.机器人可以获得的最大金币数:动态规划

力扣题目链接:https://leetcode.cn/problems/maximum-amount-of-money-robot-can-earn/

给你一个 m x n 的网格。一个机器人从网格的左上角 (0, 0) 出发,目标是到达网格的右下角 (m - 1, n - 1)。在任意时刻,机器人只能向右或向下移动。

网格中的每个单元格包含一个值 coins[i][j]:

  • 如果 coins[i][j] >= 0,机器人可以获得该单元格的金币。
  • 如果 coins[i][j] < 0,机器人会遇到一个强盗,强盗会抢走该单元格数值的 绝对值 的金币。

机器人有一项特殊能力,可以在行程中 最多感化2个单元格的强盗,从而防止这些单元格的金币被抢走。

**注意:**机器人的总金币数可以是负数。

返回机器人在路径上可以获得的 最大金币数。

示例 1:
输入: coins = \[0,1,-1,1,-2,3,2,-3,4]

输出: 8

解释:

一个获得最多金币的最优路径如下:

  1. 从 (0, 0) 出发,初始金币为 0(总金币 = 0)。
  2. 移动到 (0, 1),获得 1 枚金币(总金币 = 0 + 1 = 1)。
  3. 移动到 (1, 1),遇到强盗抢走 2 枚金币。机器人在此处使用一次感化能力,避免被抢(总金币 = 1)。
  4. 移动到 (1, 2),获得 3 枚金币(总金币 = 1 + 3 = 4)。
  5. 移动到 (2, 2),获得 4 枚金币(总金币 = 4 + 4 = 8)。

示例 2:
输入: coins = \[10,10,10,10,10,10]

输出: 40

解释:

一个获得最多金币的最优路径如下:

  1. 从 (0, 0) 出发,初始金币为 10(总金币 = 10)。
  2. 移动到 (0, 1),获得 10 枚金币(总金币 = 10 + 10 = 20)。
  3. 移动到 (0, 2),再获得 10 枚金币(总金币 = 20 + 10 = 30)。
  4. 移动到 (1, 2),获得 10 枚金币(总金币 = 30 + 10 = 40)。

提示:

  • m == coins.length
  • n == coins[i].length
  • 1 <= m, n <= 500
  • -1000 <= coins[i][j] <= 1000

解题方法:动态规划

令 d p t h i j dpthij dpthij代表到达 ( i , j ) (i, j) (i,j)时感化强盗最多 t h th th次的最大收益。

  • 如果不感化: d p t h i j = c o i n s i j + max ⁡ ( d p t h i − 1 j , d p t h i j − 1 ) dpthij=coinsij + \max(dpthi-1j, dpthij-1) dpthij=coinsij+max(dpthi−1j,dpthij−1)(上左最大的那个 + 本格子)
  • 如果感化: d p t h i j = max ⁡ ( d p t h − 1 i − 1 j , d p t h − 1 i j − 1 ) dpthij = \max(dpth-1i-1j, dpth-1ij-1) dpthij=max(dpth−1i−1j,dpth−1ij−1) (上左 t h − 1 th-1 th−1次感化中最大的那个)

注意判断下边界条件 t h th th、 i i i、 j j j大于或等于 0 0 0就好。

  • 时间复杂度 O ( n m ) O(nm) O(nm)
  • 空间复杂度 O ( n m ) O(nm) O(nm)

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-04-03 08:29:08
 */
const int INF = 1e9;
class Solution {
public:
    int maximumAmount(vector<vector<int>>& coins) {
        int n = coins.size(), m = coins[0].size();
        array<vector<vector<int>>, 3> dp;
        dp.fill(vector<vector<int>>(n, vector<int>(m)));
        dp[0][0][0] = coins[0][0];
        dp[1][0][0] = dp[2][0][0] = max(coins[0][0], 0);

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (!i && !j) {
                    continue;
                }
                for (int th = 0; th < 3; th++) {
                    dp[th][i][j] = coins[i][j] + max(i ? dp[th][i - 1][j] : -INF, j ? dp[th][i][j - 1] : -INF);
                }
                for (int th = 1; th < 3; th++) {
                    dp[th][i][j] = max(dp[th][i][j], max(i ? dp[th - 1][i - 1][j] : -INF, j ? dp[th - 1][i][j - 1] : -INF));
                }
            }
        }

        return dp[2][n - 1][m - 1];
    }
};

空间优化

TODO:

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
夏幻灵10 小时前
LeetCode 21:合并两个有序链表——双指针与哑节点详解
算法·leetcode·链表
Navigator_Z12 小时前
LeetCode //C - 1286. Iterator for Combination
c语言·算法·leetcode
数智工坊12 小时前
视觉SLAM第12讲|地图构建:单目稠密重建、RGB-D点云与八叉树地图全解析
人工智能·深度学习·矩阵·机器人
圣保罗的大教堂13 小时前
leetcode 301. 删除无效的括号 困难
leetcode
鲁邦通物联网14 小时前
绿色建筑场景下的机器人梯控设计:任务调度与运行优化方法
机器人·巡检机器人·机器人梯控·非侵入式采集·配送机器人·机器人乘梯·机器人自主乘梯
微咣科技15 小时前
2026 深圳工业机器人电池厂商巡礼:深圳市惠德技术科技,AGV 与移动装备定制锂电池供应商深度评析
科技·机器人
夏幻灵15 小时前
每日一题:LeetCode 206:反转链表——三指针与原地反转详解
算法·leetcode·链表
-dzk-16 小时前
【多维动态规划】LC 64.最小路径和
算法·动态规划
cnbestec16 小时前
当 65 个传感器铺满一只手套:TactileGlove 触觉数据手套如何支撑康复与具身智能研究
机器人·具身智能·pps·pps触觉传感器·人形机器人触觉传感器
中杯可乐多加冰16 小时前
从 SDK 到桌面应用:我用科沃斯八界把视觉、导航和机械臂接起来
人工智能·机器人·sdk·具身智能·科沃斯·八界创造者计划·科沃斯八界