P14000 [eJOI 2025] Grid
题目描述
Simona 梦想获得无数财富。她得到一个玩游戏赢取大奖的机会。
Simona 将从一个 $N \times M$ 的网格 $A$ 的格子 $(0, 0)$ 出发,这个网格填充了正整数。她必须到达格子 $(N-1, M-1)$。为此,她可以重复进行如下移动:从当前位置 $(x, y)$ 移动到任意 $(x + d, y)$ 或 $(x, y + d)$,其中 $d > 0$。每次移动时,她将获得奖励硬币 $|A_{x,y} - A_{x',y'}| - C$,其中 $(x', y')$ 是她的新位置,$C$ 是游戏开始前固定的常数代价。注意,如果表达式 $|A_{x,y} - A_{x',y'}| - C$ 的结果为负数,Simona 将失去硬币。注意游戏结束时她可能拥有负数硬币。
请帮助 Simona 确定她最多可以获得多少硬币。
其中,$|a| = a$ 若 $a \geq 0$,否则 $|a| = -a$。
### 实现细节
你需要实现函数 `max_profit`:
```cpp
long long max_profit(int N, int M, int C, std::vector A)
```
- $N, M$:网格的行数和列数;
- $C$:固定代价常数;
- $A$:大小为 $N \times M$ 的二维数组,表示网格(先行后列索引)。
该函数在每个测试中被调用一次,返回 Simona 在最优策略下结束游戏时最多能获得的硬币数。
输入格式
输入格式如下:
- 第 1 行:三个整数——$N, M, C$。
- 第 $2$ 行到第 $(N+1)$ 行:每行 $M$ 个整数——$A_{i,j}$。
输出格式
输出格式如下:
- 第 1 行:一个整数——函数调用的返回值。
说明/提示
### 示例
考虑如下调用:
```cpp
max_profit(5, 6, 4, {{20, 24, 31, 33, 36, 40},
{25, 23, 25, 31, 32, 39},
{31, 26, 21, 24, 31, 35},
{32, 28, 25, 21, 26, 28},
{36, 35, 28, 24, 21, 27}})
```
在此情况下最优路径为 $(0,0) \xrightarrow{7} (0,2) \xrightarrow{2} (1,2) \xrightarrow{10} (1,5) \xrightarrow{8} (4,5)$,她总共能获得 $7 + 2 + 10 + 8 = 27$ 枚硬币。函数必须返回 $27$。
```cpp
max_profit(2, 2, 100, {{1, 2}, {3, 4}})
```
在这里,函数必须返回 $-197$。注意答案可能为负数。
### 约束条件
- $1 \leq N, M$
- $N \cdot M \leq 500000$
- $1 \leq A_{i,j} \leq 1000000$,对所有 $0 \leq i < N, 0 \leq j < M$
- $0 \leq C \leq 1000000$
### 子任务
| 子任务 | 分值 | 依赖子任务 | 附加约束 |
| :-: | :-: | :-: | :-: |
| 0 | $0$ | - | 样例 |
| 1 | $9$ | - | $N = 1, M \leq 200$ |
| 2 | $5$ | - | $N = 1, A_{i,j} \leq A_{i,j+1}$ |
| 3 | $8$ | - | $N = 1, C = 0$ |
| 4 | $10$ | $1$ | $N = 1, M \leq 50000$ |
| 5 | $7$ | $1-4$ | $N = 1$ |
| 6 | $15$ | $1$ | $N, M \leq 200$ |
| 7 | $9$ | $2$ | $A_{i,j} \leq A_{i+1,j}, A_{i,j+1}$ |
| 8 | $12$ | $3$ | $C = 0$ |
| 9 | $12$ | $0-1, 4, 6$ | $N \cdot M \leq 50000$ |
| 10 | $13$ | $0-9$ | - |
翻译由 ChatGPT-5 完成。