1 条题解

  • 0
    @ 2026-2-17 23:55:26
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    
    int main()
    {
        int N, M;
        // 输入矩阵的行数N、列数M
        cin >> N >> M;
        int grid[6][6]; // N和M最大为6,固定数组足够使用
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++)
            {
                cin >> grid[i][j];
            }
        }
    
        // 【预处理1】筛选所有合法的单行状态:二进制无连续的1
        vector<int> valid_states;
        for (int s = 0; s < (1 << M); s++)
        {
            if ((s & (s << 1)) == 0)
            {
                valid_states.push_back(s);
            }
        }
    
        // 【预处理2】计算每行每个合法状态对应的数字和
        int row_sum[6][1 << 6] = {0};
        for (int i = 0; i < N; i++)
        {
            for (int s : valid_states)
            {
                int sum = 0;
                for (int j = 0; j < M; j++)
                {
                    if (s & (1 << j)) // 第j位为1,代表选中该格子
                    {
                        sum += grid[i][j];
                    }
                }
                row_sum[i][s] = sum;
            }
        }
    
        // DP数组初始化:初始化为负无穷,避免无效状态干扰
        int dp[6][1 << 6];
        memset(dp, -0x3f, sizeof(dp));
    
        // 初始化第一行的所有合法状态
        for (int s : valid_states)
        {
            dp[0][s] = row_sum[0][s];
        }
    
        // 【DP核心转移】逐行处理
        for (int i = 1; i < N; i++)
        {
            // 遍历当前行的所有合法状态
            for (int curr_state : valid_states)
            {
                // 遍历上一行的所有合法状态
                for (int prev_state : valid_states)
                {
                    // 检查8邻域是否冲突
                    if ((prev_state & curr_state) != 0) continue;         // 上下相邻冲突
                    if ((prev_state << 1) & curr_state) continue;        // 对角线(右上-左下)冲突
                    if ((prev_state >> 1) & curr_state) continue;        // 对角线(左上-右下)冲突
    
                    // 无冲突,更新DP值
                    dp[i][curr_state] = max(dp[i][curr_state], dp[i-1][prev_state] + row_sum[i][curr_state]);
                }
            }
        }
    
        // 【结果提取】最后一行所有合法状态的最大值即为答案
        int ans = 0;
        for (int s : valid_states)
        {
            ans = max(ans, dp[N-1][s]);
        }
    
        cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    1279
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者