德玛西亚万岁(状压dp)

德玛西亚万岁

https://ac.nowcoder.com/acm/problem/15034

题目:

给一个n*m的01矩阵。1代表可以安放士兵,0代表不能。士兵不能安放在相邻的位置(上下左右)。问有多少种安防士兵的方案。答案对1e8取模。n,m最大12


做法:

看n,m的数据范围,这是状压的数据范围。
题目只问士兵的方案数,没有限制士兵的数量。所以我们直接对每一行的状态进行枚举,一行一行转移。
对于第i行的状态sta,首先要与这行可放置士兵的状态无冲突。即sta中1的位,在给的01矩阵中都是1,即sta&b[i] == sta。然后这一行相邻位置不能同时有1。这样处理:sta&(sta<<1) == 0。经过这两个判断,这一行这种状态才合法。然后就是枚举上一行所有不与sta冲突的状态pre来转移。dp[i][sta] += dp[i-1][pre];
当然不要忘记取mod。


代码:

#include <bits/stdc++.h>
#define debug(a) cout << #a ": " << a << endl
#define IOS ios::sync_with_stdio(false), cin.tie(0)
using namespace std;
typedef long long ll;
const int mod = 1e8;
const int N = 13;
int n, m, a[N][N], b[N], dp[N][1<<N];
int main(void){    
    IOS;
    int n, m;
    while (cin >> n >> m){
        for (int i = 1; i <= n; ++i){
            b[i] = 0;
            for (int j = 1; j <= m; ++j){
                cin >> a[i][j];
                b[i] |= (a[i][j]<<(j-1));
            }
        }
        memset(dp, 0, sizeof dp);
        dp[0][0] = 1;
        for (int i = 1; i <= n; ++i){
            for (int j = 0; j < (1<<m); ++j){
                if ((b[i]&j) != j) continue;
                if (j&(j<<1)) continue;
                for (int k = 0; k < (1<<m); ++k){
                    if (k&j) continue;
                    (dp[i][j]+=dp[i-1][k]) %= mod;
                }
            }
        }
        int ans = 0;
        for (int i = 0; i < (1<<m); ++i){
            (ans += dp[n][i]) %= mod;
        }
        cout << ans << endl;
    }
    return 0;
}

全部评论

相关推荐

收到了小米的实习offer,犹豫是否要去。。。
认真搞学习:雷总还当过首富呢,公司不算大厂算独角兽吗
点赞 评论 收藏
分享
刘湘_passion:太强了牛肉哥有被激励到
点赞 评论 收藏
分享
06-13 17:33
门头沟学院 Java
顺序不记了,大致顺序是这样的,有的相同知识点写分开了1.基本数据类型2.基本数据类型和包装类型的区别3.==和equals区别4.ArrayList与LinkedList区别5.hashmap底层原理,put操作时会发生什么6.说出几种树型数据结构7.B树和B+树区别8.jvm加载类机制9.线程池核心参数10.创建线程池的几种方式11.callable与runnable区别12.线程池怎么回收线程13.redis三剑客14.布隆过滤器原理,不要背八股,说说真正使用时遇到了问题没有(我说没有,不知道该怎么回答了)15.堆的内存结构16.自己在写项目时有没有遇见过oom,如何处理,不要背八股,根据真实经验,我说不会17.redis死锁怎么办,watchdog机制如何发现是否锁过期18.如何避免redis红锁19.一个表性别与年龄如何加索引20.自己的项目的QPS怎么测的,有没有真正遇到大数量表21.说一说泛型22.springboot自动装配原理23.springmvc与springboot区别24.aop使用过嘛?动态代理与静态代理区别25.spring循环依赖怎么解决26.你说用过es,es如何分片,怎么存的数据,1000万条数据怎么写入库中27.你说用limit,那么在数据量大之后,如何优化28.rabbitmq如何批次发送,批量读取,答了延迟队列和线程池,都不对29.计网知不知道smtp协议,不知道写了对不对,完全听懵了30.springcloud知道嘛?只是了解反问1.做什么的?短信服务,信息量能到千万级2.对我的建议,基础不错,但是不要只背八股,多去实际开发中理解。面试官人不错,虽然没露脸,但是中间会引导我回答问题,不会的也只是说对我要求没那么高。面完问我在济宁生活有没有困难,最快什么时候到,让人事给我聊薪资了。下午人事打电话,问我27届的会不会跑路,还在想办法如何使我不跑路,不想扣我薪资等。之后我再联系吧,还挺想去的😭,我真不跑路哥😢附一张河科大幽默大专图,科大就是大专罢了
查看30道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务