小小的AC,大大的智慧

小小的AC,大大的智慧

许诺 · 发布于 2025-02-24 · 浏览 420 回复 0
#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

const int MOD = 100000000;

int M, N; vector<vector> grid; vector validStates; vector<vector> dp;

// 检查一个状态是否有效(没有相邻的1) bool isValidState(int state) {

return (state & (state << 1)) == 0;

}

// 检查一个状态是否与当前行的土地状态兼容 bool isCompatibleWithRow(int state, int row) {

for (int i = 0; i < N; ++i) {
    if (state & (1 << i)) {
        if (grid[row][i] == 0) {
            return false;
        }
    }
}
return true;

}

// 检查两个状态是否兼容(没有相邻的1) bool areStatesCompatible(int state1, int state2) {

return (state1 & state2) == 0;

}

int main() {

cin >> M >> N;
grid.resize(M, vector<int>(N));
for (int i = 0; i < M; ++i) {
    for (int j = 0; j < N; ++j) {
        cin >> grid[i][j];
    }
}

// 预处理所有有效的状态
for (int state = 0; state < (1 << N); ++state) {
    if (isValidState(state)) {
        validStates.push_back(state);
    }
}

// 初始化DP数组
dp.resize(M + 1, vector<int>(1 << N, 0));
dp[0][0] = 1;

// 逐行处理
for (int i = 1; i <= M; ++i) {
    for (int prevState : validStates) {
        if (dp[i - 1][prevState] == 0) continue;
        for (int currState : validStates) {
            if (isCompatibleWithRow(currState, i - 1) && areStatesCompatible(prevState, currState)) {
                dp[i][currState] = (dp[i][currState] + dp[i - 1][prevState]) % MOD;
            }
        }
    }
}

// 计算所有可能的最终状态的总和
int total = 0;
for (int state : validStates) {
    total = (total + dp[M][state]) % MOD;
}

cout << total << endl;

return 0;

}

全部回复 共 0 条

还没有人回复。往下写第一条。

发表回复