一、题目

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行的状态。

三、代码实现

  1. #include<stdio.h>
  2. int n,k;
  3. long long ans;
  4. bool s[],map[][];//判断状态是否合法;判断两个状态是否能作为临行
  5. int num[];//num[i]代表编号为i的状态含有的国王数
  6. long long f[][][];
  7. int sum;
  8. void pre_s()//预处理s数组
  9. {
  10. int i;
  11. for(i=;i<sum;++i)
  12. {
  13. if((i&(i<<))==)
  14. {
  15. s[i]=true;
  16. int t=i,cnt=;
  17. while(t)
  18. {
  19. cnt+=(t&);
  20. t>>=;
  21. }
  22. num[i]=cnt;
  23. f[][cnt][i]=;
  24. }
  25. }
  26. }
  27. void pre_map()//预处理map数组
  28. {
  29. int i,j;
  30. for(i=;i<sum;++i)
  31. {
  32. if(!s[i])continue;
  33. for(j=;j<sum;++j)
  34. {
  35. if(!s[j])continue;
  36. if((!(i&j))&&(!((i<<)&j))&&(!((i>>)&j)))map[i][j]=true;
  37. }
  38. }
  39. }
  40. void dp()
  41. {
  42. int i,j,now;
  43. for(i=;i<=n;++i)
  44. for(j=;j<=k;++j)
  45. for(now=;now<sum;++now)
  46. {
  47. if(!s[now])continue;
  48. if(num[now]>j)continue;
  49. int q;
  50. for(q=;q<sum;q++)
  51. {
  52. if(!s[q])continue;
  53. if(!map[now][q])continue;
  54. if(num[q]+num[now]>j)continue;
  55. f[i][j][now]+=f[i-][j-num[now]][q];
  56. }
  57. }
  58. }
  59. int main()
  60. {
  61. scanf("%d%d",&n,&k);
  62. sum=<<n;
  63. pre_s();
  64. pre_map();
  65. dp();
  66. for(int i=;i<sum;++i)
  67. {
  68. if(!s[i])continue;
  69. ans+=f[n][k][i];
  70. }
  71. printf("%lld",ans);
  72. return ;
  73. }

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. eclipse下SVN同步时忽略target文件夹

    直接干货:window-->preferences-->team-->Ignored Resource-->Add Pattern-->新建一个*/target/*--& ...

  2. Q的深层嵌套

    1.如果将异步方法用同步的方式执行,try catch能捕获到错误,同时不会阻塞到主进程,因此console.log(3333)能执行. var fs = require('fs'); try { v ...

  3. oracle指令

    删除用户和用户下所有的表: drop user user_name cascade; 导入数据库: cd /home/oracle/app/admin/orcl/dpdump impdp   dire ...

  4. ios10 xcode8 适配的那些事

    1.首先open Url 废弃了. http://www.tuicool.com/articles/jiMr2qA

  5. [Python] 删除指定目录下后缀为 xxx 的过期文件

    import os import time import datetime def should_remove(path, pattern, days): if not path.endswith(p ...

  6. python fabric install

    1,install setuptools 2,install pip 3,install pycrpto 4,install paramiko 5,install fabric

  7. servlet获取参数时,request.getParameter("id")参数获取失败

    servlet获取参数时,request.getParameter("id")参数获取失败,这里的参数是“index”里面href中的参数 要注意,取不到值,是不是要取的参数有没有 ...

  8. WPF绑定xml数据源

    1.界面 <UserControl x:Class="HKDCMS.Client.Demo.UIViews.UIControls.AboutUsControl" xmlns= ...

  9. zjuoj 3773 Paint the Grid

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3773 Paint the Grid Time Limit: 2 Secon ...

  10. 论文阅读(Xiang Bai——【CVPR2012】Detecting Texts of Arbitrary Orientations in Natural Images)

    Xiang Bai--[CVPR2012]Detecting Texts of Arbitrary Orientations in Natural Images 目录 作者和相关链接 方法概括 方法细 ...