题解分享
题解分享简介
地宫取宝
```cpp
// 请把代码粘贴在这里
```
include
include
include
// 用于 memset
using namespace std;
const int MOD = 1000000007;
// 题目范围:n,m
= n || y >= m) return 0;
// 2. 到达终点
if (x == n - 1 && y == m - 1) {
long long res = 0;
int current_val = grid[x][y];
int prev_max_val = (max_val_idx == 0) ? -1 : (max_val_idx - 1);
// 情况A:不拿终点的宝物
if (cnt == k) {
res = (res + 1) % MOD;
}
// 情况B:拿终点的宝物 (需满足数量+1=k 且 价值严格大于之前最大值)
if (cnt + 1 == k && current_val > prev_max_val) {
res = (res + 1) % MOD;
}
return res;
}
// 3. 记忆化检查 (如果算过,直接返回)
if (memo[x][y][cnt][max_val_idx] != -1) {
return memo[x][y][cnt][max_val_idx];
}
// 4. 继续搜索
long long ans = 0;
int current_val = grid[x][y];
int prev_max_val = (max_val_idx == 0) ? -1 : (max_val_idx - 1);
// 方向:向下 (x+1, y) 和 向右 (x, y+1)
// 选择1:不拿当前格子的宝物,直接往下走
ans = (ans + dfs(x + 1, y, cnt, max_val_idx)) % MOD;
ans = (ans + dfs(x, y + 1, cnt, max_val_idx)) % MOD;
// 选择2:拿当前格子的宝物 (如果符合条件),然后往下走
if (current_val > prev_max_val && cnt
> n >> m >> k)) return 0;
for (int i = 0; i
> grid[i][j];
}
}
// 初始化 memo 为 -1,表示未计算
memset(memo, -1, sizeof(memo));
// 从 (0,0) 开始,初始数量0,初始最大价值索引0 (代表-1)
cout << dfs(0, 0, 0, 0) << endl;
return 0;
}
查看全文
1
0
0
10



