3418. Maximum Amount of Money Robot Can Earn
Description
You are given an m x n
grid. A robot starts at the top-left corner of the grid (0, 0)
and wants to reach the bottom-right corner (m - 1, n - 1)
. The robot can move either right or down at any point in time.
The grid contains a value coins[i][j]
in each cell:
- If
coins[i][j] >= 0
, the robot gains that many coins. - If
coins[i][j] < 0
, the robot encounters a robber, and the robber steals the absolute value ofcoins[i][j]
coins.
The robot has a special ability to neutralize robbers in at most 2 cells on its path, preventing them from stealing coins in those cells.
Note: The robot's total coins can be negative.
Return the maximum profit the robot can gain on the route.
Example 1:
Input: coins = [[0,1,-1],[1,-2,3],[2,-3,4]]
Output: 8
Explanation:
An optimal path for maximum coins is:
- Start at
(0, 0)
with0
coins (total coins =0
). - Move to
(0, 1)
, gaining1
coin (total coins =0 + 1 = 1
). - Move to
(1, 1)
, where there's a robber stealing2
coins. The robot uses one neutralization here, avoiding the robbery (total coins =1
). - Move to
(1, 2)
, gaining3
coins (total coins =1 + 3 = 4
). - Move to
(2, 2)
, gaining4
coins (total coins =4 + 4 = 8
).
Example 2:
Input: coins = [[10,10,10],[10,10,10]]
Output: 40
Explanation:
An optimal path for maximum coins is:
- Start at
(0, 0)
with10
coins (total coins =10
). - Move to
(0, 1)
, gaining10
coins (total coins =10 + 10 = 20
). - Move to
(0, 2)
, gaining another10
coins (total coins =20 + 10 = 30
). - Move to
(1, 2)
, gaining the final10
coins (total coins =30 + 10 = 40
).
Constraints:
m == coins.length
n == coins[i].length
1 <= m, n <= 500
-1000 <= coins[i][j] <= 1000
Solutions
Solution 1: Memoized Search
We design a function \(\textit{dfs}(i, j, k)\), which represents the maximum amount of coins the robot can collect starting from \((i, j)\) with \(k\) conversion opportunities left. The robot can only move right or down, so the value of \(\textit{dfs}(i, j, k)\) depends only on \(\textit{dfs}(i + 1, j, k)\) and \(\textit{dfs}(i, j + 1, k)\).
- If \(i \geq m\) or \(j \geq n\), it means the robot has moved out of the grid, so we return a very small value.
- If \(i = m - 1\) and \(j = n - 1\), it means the robot has reached the bottom-right corner of the grid. If \(k > 0\), the robot can choose to convert the bandit at the current position, so we return \(\max(0, \textit{coins}[i][j])\). If \(k = 0\), the robot cannot convert the bandit at the current position, so we return \(\textit{coins}[i][j]\).
- If \(\textit{coins}[i][j] < 0\), it means there is a bandit at the current position. If \(k > 0\), the robot can choose to convert the bandit at the current position, so we return \(\textit{coins}[i][j] + \max(\textit{dfs}(i + 1, j, k), \textit{dfs}(i, j + 1, k))\). If \(k = 0\), the robot cannot convert the bandit at the current position, so we return \(\textit{coins}[i][j] + \max(\textit{dfs}(i + 1, j, k), \textit{dfs}(i, j + 1, k))\).
Based on the above analysis, we can write the code for memoized search.
The time complexity is \(O(m \times n \times k)\), and the space complexity is \(O(m \times n \times k)\). Here, \(m\) and \(n\) are the number of rows and columns of the 2D array \(\textit{coins}\), and \(k\) is the number of conversion opportunities, which is \(3\) in this problem.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|