(状压DP)排兵布阵3
/*
题目描述
你作为军队总司令,领导着一堆虾兵蟹将,现在你需要为他们排兵布阵。地图包含n*m的格子,有些格子可以安排部队用1表示,有些格子有障碍物不可以安排部队用0表示。但是要注意,你手下的虾兵蟹将们经常起内讧,所以你不可以将两个部队安排在相邻位置(上下左右四个方向)。请问一共有多少种方案,结果对100000000取模。当然不安排也算一种方案。
输入格式
输入文件plan3.in 输入第一行为正整数n和m,均不超过12。接着输入n*m个0或1代表地图。
输出格式
输出文件plan3.out 输出一个整数。
输入样例1:
3 2
0 1
1 1
0 1
输出样例1:
9
输入样例2:
3 3
1 0 0
0 1 1
0 0 0
输出样例2:
5
*/
这道题目是典型的状压DP。我们首先要知道状态怎么存储。
如状态放 放 放 不放=0111(2)=7(10)。注意我们是倒序存储,0为不放,1为放。
输入时就把每一行转化为数字,存在a数组里。预处理所有合法的状态,存在b数组里。cnt为合法状态数量。
三种运算:
运算 | 意思 | 实例 |
i&(i<<1)==0 | 判断i是否为合法状态 | 3&(3<<1)==2 故3是非法状态 |
b[j]|a[i]==a[i] | 判断第i行能否摆放合法状态j | b[]={0,0,1,2},a[]={0,2,3,2},b[1]|a[1]==a[1],故第1行能为状态2 |
b[j]&b[k]==0 | 判断合法状态j、k是否有冲突 | b[]={0,0,1,2},b[1]&b[2]==0,故合法状态j、k没有冲突 |
定义状态dp[i][j]为前i行已摆放完毕且第i行状态为j的方案数取模。预处理dp[1][],因为他是边界。剩下的就可以用DP了,dp[i][b[j]]=sum{a[i-1][b[和合法状态j无冲突的合法状态k]]}
填空版代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,tmp,cnt,ans;
int a[20],b[____],dp[20][____];
int main(){freopen("plan3.in","r",stdin);freopen("plan3.out","w",stdout);cin>>n>>m;for(int i=1;i<=n;i++)for(int j=0;j<m;j++){cin>>tmp;__________________;}for(int i=0;________;i++)if((i&(i<<1))==0) b[_____]=i;for(int i=1;i<=cnt;i++)if((b[i]|a[1])==a[1]) dp[1][____]=1;for(int i=_;i<=n;i++)for(int j=1;j<=cnt;j++)if((b[j]|a[i])==a[i])for(int k=1;k<=cnt;k++)if((b[k]&b[j])==0){dp[i][____]+=dp[i-1][____];dp[i][____]%=100000000;}for(int i=1;i<=cnt;i++){ans+=dp[n][____];ans%=100000000;}cout<<ans<<endl;return 0;
}
看到这儿了,本蒟蒻请求您点个赞,或者关注,赞达到10个出下一期。若有问题欢迎评论!
(状压DP)排兵布阵3相关推荐
- HDU 4539郑厂长系列故事――排兵布阵(状压DP)
HDU 4539 郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma ...
- 郑厂长系列故事——排兵布阵 状态压缩DP
郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
- 【背包DP练习】洛谷 P5020货币系统 P1757通天之分组背包 P1064[NOIP2006 提高组]金明的预算方案 P5322 [BJOI2019]排兵布阵
洛谷 P5020货币系统 https://www.luogu.com.cn/problem/P5020 思路是把货币从小到大排序,然后按顺序依次完全背包dp,每次dp检查i-1种面值的货币能不能凑出第 ...
- hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地
题意: 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Other ...
- POJ - 1185 炮兵阵地(状压dp)
题目链接:点击查看 题目大意:中文题,题意很清晰,不多赘述 题目分析:最基础的状压dp,需要考虑如何转移,因为每一个炸弹所涉及的范围都是上下左右两个格子,我们可以从第一行开始向下转移,这样某一行的状态 ...
- HDU 4917 Permutation(拓扑排序 + 状压DP + 组合数)
题目链接 Permutation 题目大意:给出n,和m个关系,每个关系为ai必须排在bi的前面,求符合要求的n的全排列的个数. 数据规模为n <= 40,m <= 20. 直接状压DP空 ...
- 动态规划 —— 状压 DP
[概述] 通常将以一个集合内的元素信息作为状态且状态总数为指数级别的动态规划称为状态压缩动态规划. 其是一类以集合信息为状态的特殊的动态规划问题,主要有传统集合动态规划与基于连通性状态压缩的动态规划两 ...
- NYOJ 81:炮兵阵地(状压DP)
炮兵阵地 时间限制:2000 ms | 内存限制:65535 KB 难度:6 描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地 ...
- [BJOI2019]排兵布阵
排兵布阵 题解 今天比赛上这道题好像是人均题呀. 好吧,就一个简单的,连优化都不需要的背包dp. 我们每次只需要处理在比第i个城堡的第j大的玩家大的情况,不必把所有的兵的情况都处理完. 然后就可以过了 ...
最新文章
- 转 sklearn: TfidfVectorizer 中文处理及一些使用参数
- 微信小程序搜索功能!附:小程序前端+PHP后端
- redis VS kafka
- EOS账户系统(4)账户权限分级
- 服务降级-降级的概念
- Xampp里Mysql服务启动不起来,错误1067
- java国际化——Locale+数字格式
- ajax 传递arraybuffer,jQuery $ .ajax或$ .load是否允许responseType arrayBuffer?
- Windows Eclipse Maven 安装
- 【Wonder整理】防止重复提交并弹出半透明对话框
- windows 环境变量设置
- LVM扩容之xfs文件系统
- JS根据身份证号码获取性别
- whta is the前后端分离
- thinkphp5 模板使用php,模板 · ThinkPHP5.1完全开发手册 · 看云
- 对于Java接口的独到理解
- Codeforces - King Kog‘s Reception
- PHP学习之SAPI
- 【华为OD机试 2023】完美走位(C++ Java JavaScript Python 100%)
- 【电机原理与拖动基础】Unit 1 直流电机(你还不知道电机是怎么一回事吗?那就快来看一看吧!)