1 条题解
-
0
#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
- 上传者