【BZOJ1087】[SCOI2005] 互不侵犯King(状压DP)
大致题意: 在\(N×N\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案(国王能攻击到它周围的8个格子)。
状压\(DP\)
一看到这道题我就想到了经典的八皇后问题,但是,这道题其实可以用状压\(DP\)来做。
我们可以发现,影响该行国王摆放方法的只有上一行国王的摆放方式,因此,对于第\(i\)行,我们只需要知道第\(i-1\)行的国王的摆放方式即可。所以,我们可以用\(f[i][j]\)来记录第\(i\)行,国王摆放方式为\(j\)的方案数即可(这里将摆放方式状态压缩成一个数)。
注意要先预处理一下对于某一行的一种摆放方式是否合法且用了多少个国王。
代码
#include<bits/stdc++.h>
#define LL long long
#define N 9
using namespace std;
int n,m,could[(1<<N)+5],tot[(1<<N)+5];
LL f[N+5][N*N+5][(1<<N)+5];
inline char tc()
{
static char ff[100000],*A=ff,*B=ff;
return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0;int f=1;char ch;
while(!isdigit(ch=tc())) f=ch^'-'?1:-1;
while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
x*=f;
}
inline void write(LL x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void Start()//预处理每种摆放方案是否合法且用了几个国王
{
register int i;
for(i=0;i<(1<<n);++i)
{
could[i]=1,tot[i]=0;
for(int num=i,lst=0;num;lst=num&1,num>>=1)
{
if(num&1)//若当前一位摆放了国王
{
if(lst) could[i]=0;//若前一位摆放了国王,则此方案不合法
++tot[i];//将国王的使用数量加1
}
}
}
}
inline int check(int x,int y)
{
return !((x&y)||((x<<1)&y)||(x&(y<<1)));//比较两行的国王是否会攻击到对方
}
int main()
{
register int i,j,k,l;
read(n),read(m),Start(),f[0][0][0]=1;
for(i=1;i<=n;++i)//核心代码
for(j=0;j<(1<<n);++j)
if(could[j]&&tot[j]<=m)
for(k=tot[j];k<=m;++k)
for(l=0;l<(1<<n);++l)
if(could[l]&&check(j,l)) f[i][k][j]+=f[i-1][k-tot[j]][l];//进行转移,计算该行当前摆放方式的方案数
LL ans=0;
for(j=0;j<(1<<n);++j) ans+=f[n][m][j];//统计答案
return write(ans),0;
}
【BZOJ1087】[SCOI2005] 互不侵犯King(状压DP)的更多相关文章
- [BZOJ1087] [SCOI2005] 互不侵犯King (状压dp)
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- 【BZOJ1087】 [SCOI2005]互不侵犯King 状压DP
经典状压DP. f[i][j][k]=sum(f[i-1][j-cnt[k]][k]); cnt[i]放置情况为i时的国王数量 前I行放置情况为k时国王数量为J #include <iostre ...
- BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP
[题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...
- 互不侵犯king (状压dp)
互不侵犯king (状压dp) 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.\(1\le n\ ...
- BZOJ-1087 互不侵犯King 状压DP+DFS预处理
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...
- bzoj1087 互不侵犯King 状压dp+bitset
题目传送门 题目大意:中文题面. 思路:又是格子,n又只有9,所以肯定是状压dp,很明显上面一行的摆放位置会影响下一行,所以先预处理出怎样的二进制摆放法可以放在上下相邻的两行,这里推荐使用bitset ...
- [SCOI2005]互不侵犯(状压DP)
嗝~算是状压DP的经典题了~ #\(\mathcal{\color{red}{Description}}\) 在\(N×N\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻 ...
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...
- 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)
洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...
随机推荐
- 清北刷题冲刺 11-01 p.m
轮换 #include<iostream> #include<cstdio> #include<cstring> #define maxn 1010 using n ...
- jzoj3208. 【JSOI2013】编程作业(kmp)
题面 Description Will相信,很多同学都有过这样的经历:大牛已经写好了编程作业,而作为菜鸟的自己不会写怎么办呢?拿大牛的代码抄一下嘛!但是提交一模一样的作业是不是不太好?于是就改一改变量 ...
- 洛谷P3193 [HNOI2008]GT考试(KMP,矩阵)
传送门 大佬讲的真吼->这里 首先考虑dp,设$f[i][j]$表示长串匹配到第$i$位,短串最多匹配到$j$位时的方案数 那么答案就是$\sum_{i=0}^{m-1}f[n][i]$ 然后考 ...
- JVM系列文章汇总
JVM中运行时数据区中的堆.栈.方法区等区域的特性介绍 Java中class文件的组成结构 JVM的类加载生命周期介绍 Java堆.新生代老年代的特点.堆中的内存分配策略 JVM垃圾收集算法详解 JV ...
- Ubuntu16.04安装Nvidia显卡驱动+Cuda8.0+Cudnn6.0
一.安装Nvidia显卡驱动(gtx1050ti) 参考链接:Ubuntu16.04.2 LTS 64bit系统装机记录中的显卡驱动安装部分. 二.安装Cuda8.0 1.确定自己的系统信息,以Ubu ...
- 简单的PHP+Mysql实现分页
<?php /** * PHP+Mysql实现分页 * **/ ?> <html> <head> <meta http-equiv="Content ...
- Tomcat从socket到java Servlet
整体架构图 一. 启动阶段 BootStrap的main方法加载server.xml配置文件,封装成Server,Service,Connector,Engine等java对象 Server初始化== ...
- 统计分析: 跨库多表join
mysql中如果多个库在一个实例上, 可以进行多表的跨库Join, 但是如果后期数据库分隔到不同的实例机器上,有查询问题 mysql的查询优化器没有其他商业数据库做的好, 用来CRUD还行, 但是做大 ...
- Unity www动态加载网上图片
一. 1.新建一个UGUI的Button,删掉它的Image组件,添加一个Raw Image组件.如图: 由于删除了Image组件,所以画圈的位置是空的,运行后会自动把Raw Image添加到那里. ...
- GraphQL实战经验和性能问题的解决方案
在现在的公司使用GraphQL有一段时间了. 现公司从创立之后的很长一段时间内是纯PHP的技术栈,前端.后端都在PHP代码中糅合在一起.新功能越加越多,页面越来越复杂之后,那些混在在PHP代码中的HT ...