【玉米田】

题目

代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int mod = 1e8;
const int M = 1 << 12;
LL f[13][M];
int g[13];
vector<int> state;
vector<int> p[M];
int n, m;
bool check(int x)
{
    return !(x & x << 1);
}
int main()
{
    cin >> m >> n;
    for(int i = 1; i <= m; i++)
    {
        for(int j = 0; j < n; j++)
        {
            int t;
            cin >> t;
            g[i] |= !t << j;
        }
    }
    
    for(int i = 0; i < 1 << n; i++)
    {
        if(check(i)) state.push_back(i);
    }
    
    for(auto a : state)
        for(auto b : state)
        {
            if((a & b) == 0) p[a].push_back(b);
        }
    
    f[0][0] = 1;
    for(int i = 1; i <= m+1; i++)
    {
        for(auto a : state)
        {
            f[i&1][a] = 0;
            if(a & g[i]) continue;
            for(auto b : p[a])
            {
                f[i&1][a] = (f[i&1][a] + f[(i-1)&1][b]) % mod;
            }
        }
    }
    
    cout << f[(m+1)&1][0];
    return 0;
}

注意

采用滚动数组时,一定要注意恢复,而且不仅是更新之前恢复,对于那些不更新的值也要恢复,因为不更新不代表继承上一次的值,而是采用默认值,因此必须恢复,下面的这个代码就闹了这个笑话

cpp 复制代码
    f[0][0] = 1;
    for(int i = 1; i <= m+1; i++)
    {
        for(auto a : state)
        {
            f[i&1][a] = 0;
            if(a & g[i]) continue;
            //f[i&1][a] = 0;
            for(auto b : p[a])
            {
                f[i&1][a] = (f[i&1][a] + f[(i-1)&1][b]) % mod;
            }
        }
    }
相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark3 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法