风吹叶落wxhsn 题解分享 · 2026/4/7
地宫取宝
```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