1 条题解

  • 0
    @ 2025-5-28 20:37:00
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    const int MOD = 100000000;
    
    int main() {
        int M, N;
        bool bbb;
        cin >> M >> N; 
        vector<vector<int>> grid(M, vector<int>(N));
        for (int i = 0; i < M; ++i) 
        for (int j = 0; j < N; ++j) cin >> grid[i][j];          
        vector<vector<int>> v(M);
        for (int i = 0; i < M; ++i) 
        for (int mask = 0; mask < (1 << N); ++mask) {
            bbb = 1;
            for (int j = 0; j < N - 1; ++j) 
            if ((mask & (1 << j)) && (mask & (1 << (j + 1)))) {
                bbb = 0;
                break;
            }          
            for (int j = 0; j < N; ++j) 
            if ((mask & (1 << j)) && grid[i][j] == 0) {
                bbb = 0;
                break;
            }           
            if (bbb) v[i].push_back(mask);           
        }   
        vector<vector<int>> dp(M, vector<int>(1 << N, 0));
        for (int mask : v[0]) dp[0][mask] = 1;  
        for (int i = 1; i < M; ++i) 
        for (int j : v[i]) 
        for (int k : v[i - 1]) 
    	if ((j & k) == 0) dp[i][j] = (dp[i][j] + dp[i - 1][k]) % MOD;   
        int ans = 0;
        for (int mask : v[M - 1]) ans = (ans + dp[M - 1][mask]) % MOD;    
        cout << ans;  
    }
    
    

    代码解释 ​​输入处理​​:读取网格大小和每个格子的状态(可种植或需要休养)。 ​​预处理合法状态​​: 对于每一行,枚举所有可能的种植状态(位掩码) 检查每个状态是否合法(没有相邻种植且不在休养土地上种植) ​​动态规划初始化​​: 初始化第一行的所有合法状态的方案数为1 ​​状态转移​​: 对于每一行,检查当前行状态与上一行状态是否兼容(没有上下相邻种植) 累加兼容状态的方案数 ​​结果计算​​:将所有可能的最后一行状态的方案数相加,得到总方案数

    • 1

    信息

    ID
    3293
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    98
    已通过
    13
    上传者