一、题目

Description

在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上、下、左、右,以及左上、左下、右上、右下八个方向上附近的各一个格子,共8个格子。

Input

只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)

Output

方案数

Sample Input

3 2

Sample Output

16

原题链接→_→bzoj1087: [SCOI2005]互不侵犯King

二、题目分析

其实我们可以用一张美妙的表来解决这道题(划掉)这道题我们首先考虑暴搜解决,然而似乎状态略多会炸……

搜索不行,我们很容易能想到DP,这里我们引入一个神奇的DP——状态压缩型动态规划。状态压缩是状压DP的核心(废话!),本人在上一篇blog中详细介绍了状态压缩的思想,诸位看官不妨移步一看,可能会对理解状压DP起到一定帮助(链接→_→【宽度优先搜索】神奇的状态压缩 CodeVs1004四子连棋

对于每一行的状态,我们用1表示国王,0表示不放国王。由于每个位置只有0和1两种状态,我们可以使用位运算判断每行的状态是否合法。例如:10101010就是一种合法状态,而11111111就不合法。每行状态表示的十进制数就是我们压缩后的状态。

我们需要做两个预处理,先枚举每行所有可能的状态,记录下合法状态。然后判断两个状态是否能作为临行放置,并用布尔类型的二维数组存储其关系。

预处理之后,就是常规的DP,状态转移方程如下:

f[i][j][now]=∑f[i-1][j-num[now]][q]

略作说明:f[i][j][k]代表前i行,总共放j个国王,第i行状态为k时的方案数。状态转移方程中的num[now]代表状态为now的行中国王的数目,q表示第i-1行的状态。

三、代码实现

 #include<stdio.h>
int n,k;
long long ans;
bool s[],map[][];//判断状态是否合法;判断两个状态是否能作为临行
int num[];//num[i]代表编号为i的状态含有的国王数
long long f[][][];
int sum;
void pre_s()//预处理s数组
{
int i;
for(i=;i<sum;++i)
{
if((i&(i<<))==)
{
s[i]=true;
int t=i,cnt=;
while(t)
{
cnt+=(t&);
t>>=;
}
num[i]=cnt;
f[][cnt][i]=;
}
}
}
void pre_map()//预处理map数组
{
int i,j;
for(i=;i<sum;++i)
{
if(!s[i])continue;
for(j=;j<sum;++j)
{
if(!s[j])continue;
if((!(i&j))&&(!((i<<)&j))&&(!((i>>)&j)))map[i][j]=true;
}
}
}
void dp()
{
int i,j,now;
for(i=;i<=n;++i)
for(j=;j<=k;++j)
for(now=;now<sum;++now)
{
if(!s[now])continue;
if(num[now]>j)continue;
int q;
for(q=;q<sum;q++)
{
if(!s[q])continue;
if(!map[now][q])continue;
if(num[q]+num[now]>j)continue;
f[i][j][now]+=f[i-][j-num[now]][q];
}
}
}
int main()
{
scanf("%d%d",&n,&k);
sum=<<n;
pre_s();
pre_map();
dp();
for(int i=;i<sum;++i)
{
if(!s[i])continue;
ans+=f[n][k][i];
}
printf("%lld",ans);
return ;
}

bzoj1087 互不侵犯king

弱弱地说一句,本蒟蒻码字也不容易,转载请注明出处http://www.cnblogs.com/Maki-Nishikino/p/5992703.html

【状压DP】bzoj1087 互不侵犯king的更多相关文章

  1. 【状压dp】互不侵犯KING

    互不侵犯KING Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3866  Solved: 2264[Submit][Status][Discuss] ...

  2. 状压DP之互不侵犯

    题目描述 这里 在\(N*N\) 的棋盘里面放\(k\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入格式 只有 ...

  3. BZOJ-1087 互不侵犯King 状压DP+DFS预处理

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...

  4. bzoj1087 互不侵犯King 状压dp+bitset

    题目传送门 题目大意:中文题面. 思路:又是格子,n又只有9,所以肯定是状压dp,很明显上面一行的摆放位置会影响下一行,所以先预处理出怎样的二进制摆放法可以放在上下相邻的两行,这里推荐使用bitset ...

  5. bzoj1087互不侵犯King(状压)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1087 简单的状压dp.但是wa了好几发.注意long long. 注意0和0的连边.而且不能 ...

  6. 刷题向》关于第一篇状压DP BZOJ1087 (EASY+)

    这是本蒟蒻做的第一篇状压DP,有纪念意义. 这道题题目对状压DP十分友善,算是一道模板题. 分析题目,我们发现可以用0和1代表每一个格子的国王情况, 题目所说国王不能相邻放置,那么首先对于每一行是否合 ...

  7. bzoj1087互不侵犯King——状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1087 水题... 然而犯了两个致命小错误,调了好半天...详见注释. 代码如下: #incl ...

  8. 互不侵犯_状压$dp$

    如果有想学习状压\(dp\)的童鞋,请光临博客状压\(dp\)初学 互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八 ...

  9. BZOJ1087 SCOI2005 互不侵犯King 【状压DP】

    BZOJ1087 SCOI2005 互不侵犯King Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附 ...

随机推荐

  1. 关于phpmyadmin的小笔记

    默认情况下,phpmyadmin联系的是localhost. 如果此时hostname不是localhost而是其它什么的话,在phpmyadmin是不能连接上的,虽然在命令行mysql -h loc ...

  2. "mkimage" command not found - U-Boot images will not be built

    编译内核的时候出现错误:"mkimage" command not found - U-Boot images will not be built 参考链接 http://blog ...

  3. 使用HttpClient连接池进行https单双向验证

    https单双向验证环境的搭建参见:http://www.cnblogs.com/YDDMAX/p/5368404.html 一.单向握手 示例程序: package com.ydd.study.he ...

  4. Python之路----------ConfigParser模块

    Python的ConfigParser 废话不说,拿去用 #coding=utf-8 import configparser ''' 基於Python3.0版本寫的配置文件的創建.增加.刪除.修改等方 ...

  5. GPS部标平台的架构设计(二) 可扩展性设计

    在设计的前夕,设计人员喜欢把领导对未来业务的期望带入到设计目标当中,比如当前业务也不过是接入几千辆车,未来业务增长也不过几万台,但领导很多激情,强势要求二期平台的接入能力要达到20万台,这个要求带入到 ...

  6. solr 日期查询格式

    //solr 日期格式: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); //开始 ...

  7. SQLServer针对排名函数ROWNUMBER()、RANK()、DENSE_RANK()、NTILE的研究!~

    相信大家在软件工程中经常会遇到对某些数据进行排名的问题,尤其是对于电子商务的HR来说“大手笔”是非常具有潜在价值的!~至于都有哪些价值这个超出本文的范畴不予进行说明,但是不得不说的是每一个精明的HR以 ...

  8. 将图片插入到excel中

    static void Main(string[] args) { //说明:插入图片 //1.创建EXCEL中的Workbook IWorkbook myworkbook = new HSSFWor ...

  9. linux更改 DNS 的一般方式

    一.第一种方法(常规方法) 在 Linux (笔者用fedora) 下当使用 NetworkManager时,更改 DNS 的一般方式: 修改 /etc/resolv.conf 文件, 添加 &quo ...

  10. Extjs 3.4 同值合并

    摘自:http://www.cnblogs.com/kunpengit/archive/2012/11/13/2768239.html/** * grid gridPanel 需要合并的表格 * ro ...