1 条题解

  • 1
    @ 2025-10-27 14:56:05
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int n, k;
    int g[10][10];
    int ans = -1;
    
    // DFS搜索所有路径
    void dfs(int x, int y, int sum, int cnt) {
    // 到达终点
        if (x == n && y == n) {
            if (cnt == k) {
                ans = max(ans, sum);
            }
            return;
        }
    
    // 向右移动
        if (y + 1 <= n) {
            int ne = g[x][y + 1];
            int pl = (ne % 2 == 0) ? 1 : 0;
            dfs(x, y + 1, sum + ne, cnt + pl);
        }
    
    // 向下移动
        if (x + 1 <= n) {
            int ne = g[x + 1][y];
            int pl = (ne % 2 == 0) ? 1 : 0;
            dfs(x + 1, y, sum + ne, cnt + pl);
        }
    
    }
    
    int main() {
    // 读取输入
        cin >> n >> k;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                cin >> g[i][j];
            }
        }
    
    // 起点(1,1)的格子也要算上
        int st = (g[1][1] % 2 == 0) ? 1 : 0;
        int stsum = g[1][1];
    
    // 开始DFS搜索
        dfs(1, 1, stsum, st);
    
    // 输出结果
        cout << ans << endl;
    
        return 0;
    
    }
    
    
    
    
    • @ 2025-10-28 10:55:35

      dfs暴力枚举所有路径,同时记录路径的两个关键信息:

      路径的感恩值总和

      路径中经过的偶数感恩值格子的数量

      当路径到达终点 (n, n) 时,检查“偶数格子数量是否恰好等于k”,若满足则更新“最大感恩度”的结果。

信息

ID
1159
时间
1000ms
内存
256MiB
难度
4
标签
递交数
45
已通过
21
上传者