牛客网多校训练 德玛西亚万岁

题目描述   来源

德玛西亚是一个实力雄厚、奉公守法的国家,有着功勋卓著的光荣军史。

这里非常重视正义、荣耀、职责的意识形态,这里的人民为此感到强烈自豪。

有一天他们想去制裁邪恶的比尔吉沃特,于是派遣了自己最优秀的战士。

结果比尔吉沃特领土太小,只有长为n宽为m共计n*m块土地,其中有些土

地标记为0表示为高山峻岭或者深海湖泊,英雄们无法在其中站立,只有标

记为1的土地才能容纳一个英雄。德玛西亚的英雄们战斗时有一个特点,他

们不希望队友站在自己旁边显得很暧昧。请问最多能有多少种安排德玛西

亚英雄的方法?

输入描述:

输入包含多组测试数据;每组数据的第一行包含2个整数n和m (n <= 12, m <= 12 ),之间用空格隔开;接下来的n行,每行m个数,表示n*m的比尔吉沃特领土。

输出描述:

输出一个整数n代表安排应用的方法。(答案取膜100000000)

示例1

输入

3 3
1 1 1
0 1 1
1 0 0

输出

24总结1.使用状态压缩,逐行枚举2.进行位运算一定不能吝啬括号,因为位运算的优先级实在是太低了3.因为m,n的范围很小,所以使用一些复杂度高的算法也没什么关系的
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f//可以用于memset
int map[13];//map[i]第i行的状态
long long dp[13][1<<12];//dp[i][j],第1到第i行,并且第i行状态为j时,的安排方法
int isok[1<<12];//isok[i]指第i个不相邻站立的状态,以后就枚举这些状态
int main()
{
    int n,m,k;long long ans;
    while(cin>>n>>m)
    {
        memset(dp,0,sizeof(dp));
        memset(map,0,sizeof(map));
        ans=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=m-1;j>=0;j--)
            {
                cin>>k;
                if(k==1)
                    map[i]+=(1<<(j));
            }
        }
        int len=1<<m;int num=0;
        for(int i=0;i<len;i++)//初始化第一行
        {
            if((i&(i<<1))==0)
            {
                isok[num++]=i;
                if((i|map[1])==map[1])
                {
                    dp[1][i]=1;
                }
            }
        }
        for(int i=2;i<=n;i++)
        {
            for(int j=0;j<num;j++)
            {
                int a1=isok[j];
                if((a1|map[i])==map[i])
                for(int k=0;k<num;k++)
                {
                    int a2=isok[k];
                    if((a2&a1)==0)
                    dp[i][a1]+=dp[i-1][a2];
                }
            }
        }
        for(int i=0;i<num;i++)
        {
             ans+=dp[n][isok[i]];
             ans%=100000000;
        }
        cout<<ans<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/carcar/p/8450219.html

时间: 2024-10-10 14:52:56

牛客网多校训练 德玛西亚万岁的相关文章

牛客网多校训练 训练技巧

题目描述  来源 常州大学组织了新生寒假训练一共N天,每天训练可以获得的训练效果是Ei.但是如果连续训练超过K天,萌新们会受不了而被劝退. 现在负责人想知道,如何安排能保证萌新不会被劝退并且能获得最大的训练效果. 输入描述: 第一行:两个用空格隔开的整数:N和K,1≤N≤100000,1≤K≤N第二行到N+1行:第i+1行有一个整数,表示第N天的训练效果是Ei,(0 <= Ei <= 1,000,000,000) 输出描述: 第一行:单个整数,表示最大的能力之和 示例1 输入 5 2 1 2

牛客网多校训练 道路问题

题目描述 随着如今社会的不断变化,交通问题也变得越来越重要,所以市长决定建设一些公路来方便各个城市之间的贸易和交易.虽然市长的想法很好,但是他也遇到了一般人也经常头疼的问题,那就是手头的经费有限--在规划过程中,设计师们已经预算出部分城市之间建设公路的经费需求.现在市长想知道,它能不能将他的m个城市在有限的经费内实现公路交通.如果可以的话,输出Yes,否则输出No(两个城市不一定要直接的公路相连,间接公路到达也可以.) 输入描述: 测试输入包含多条测试数据每个测试数据的第1行分别给出可用的经费c

牛客网多校训练 酸碱滴定

题目描述    题目来源 有时候你会抱怨,什么时候才能到终点. 有时候你会迫不及待,怎么颜色还不改变. 滴定管长场的,我们的路长长的. 用心的放入每一滴,终点就在你手心. 今天小星需要去完成一个酸碱滴定实验.,实验室老师要求用 A mol/L 的HCL去测定一瓶NaOH的浓度.首先小星取出了一个锥形瓶,在里面放入的Bml的NaOH,并滴加1-2滴甲基橙,然后用HCL去滴定他 当滴定至恰好变为红色时(可以认为H离子浓度等于OH离子浓度),用了C ml 小星现在需要计算NaOH的浓度是多少?单位(m

2018年全国多校算法寒假训练营练习比赛(第二场)F - 德玛西亚万岁

链接:https://www.nowcoder.com/acm/contest/74/F来源:牛客网 题目描述 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀.职责的意识形态,这里的人民为此感到强烈自豪. 有一天他们想去制裁邪恶的比尔吉沃特,于是派遣了自己最优秀的战士. 结果比尔吉沃特领土太小,只有长为n宽为m共计n*m块土地,其中有些土 地标记为0表示为高山峻岭或者深海湖泊,英雄们无法在其中站立,只有标 记为1的土地才能容纳一个英雄.德玛西亚的英雄们战

【题集】牛客网&#183;2018年全国多校算法寒假训练营练习比赛(第二场)

原文链接:2018年全国多校算法寒假训练营练习比赛(第二场) A 吐泡泡 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 小鱼儿吐泡泡,嘟嘟嘟冒出来.小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡"o". 两个相邻的小泡泡会融成一个大泡泡,两个相邻的大泡泡会爆掉. (是的你没看错,小气泡和大气泡不会产生任何变化的,原因我也不知道.) 例如:ooOOoooO经过一段时间

牛客网华为机试训练第3题 明明的随机数

今天花了一下午才把明明的随机数这个搞明白,期间和牛客网的编译器殊死搏斗.一直发现在本地编译器运行成功,但是在牛客上的老师不能通过.整的十分的恼火和焦躁.后来看到了相同的问题,才发现解决之道. 时间限制:1秒 空间限制:32768K 热度指数:222608 本题知识点: 数组 算法知识视频讲解 题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不

牛客网NowCoder 2018年全国多校算法寒假训练营练习比赛(第四场)A.石油采集(dfs) B.道路建设(最小生成树prim) C.求交集(暴力) F.Call to your teacher(迪杰斯特拉乱用) H.老子的全排列呢(dfs)

菜哭了... A.石油采集 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 链接:https://www.nowcoder.com/acm/contest/76/A来源:牛客网 题目描述 随着海上运输石油泄漏的问题,一个新的有利可图的行业正在诞生,那就是撇油行业.如今,在墨西哥湾漂浮的大量石油,吸引了许多商人的目光.这些商人们有一种特殊的飞机,可以一瓢略过整个海面20米乘10米这么大的长方形.(上下相

牛客网在线判题系统JavaScript(V8)使用

JavaScript作为一种弱类型的编程语言,语法和C/C++.JAVA等存在差别,但是对于大部算法题,不只是C/C++.JAVA,也依然可以使用JavaScript来实现.所以在牛客网中,如果你喜欢JavaScript这门编程语言,同时对数据结构与算法感兴趣,当然可以使用这门语言去刷编程题. 大家有没有跟我碰到过和我类似的情况,在牛客网刷编程题的时候,编译器提供的是Javascript(v8 6.0.0),在线编程部分前端编程还好,只用在题目给出的函数中补充就行.但苦恼的是,我们不知道如何像C

牛客网-求和

题目描述 输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来 输入描述: 每个测试输入包含2个整数,n和m 输出描述: 按每个组合的字典序排列输出,每行输出一种组合 示例1 输入 5 5 输出 1 4 2 3 5 #include<iostream> #include<string> #include<vector> #include<algorithm> using namespac