点此看题面

大致题意: 在\(N×N\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案(国王能攻击到它周围的8个格子)。

状压\(DP\)

一看到这道题我就想到了经典的八皇后问题,但是,这道题其实可以用状压\(DP\)来做。

我们可以发现,影响该行国王摆放方法的只有上一行国王的摆放方式,因此,对于第\(i\)行,我们只需要知道第\(i-1\)行的国王的摆放方式即可。所以,我们可以用\(f[i][j]\)来记录第\(i\)行,国王摆放方式为\(j\)的方案数即可(这里将摆放方式状态压缩成一个数)。

注意要先预处理一下对于某一行的一种摆放方式是否合法且用了多少个国王。

代码

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define N 9
  4. using namespace std;
  5. int n,m,could[(1<<N)+5],tot[(1<<N)+5];
  6. LL f[N+5][N*N+5][(1<<N)+5];
  7. inline char tc()
  8. {
  9. static char ff[100000],*A=ff,*B=ff;
  10. return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
  11. }
  12. inline void read(int &x)
  13. {
  14. x=0;int f=1;char ch;
  15. while(!isdigit(ch=tc())) f=ch^'-'?1:-1;
  16. while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
  17. x*=f;
  18. }
  19. inline void write(LL x)
  20. {
  21. if(x<0) putchar('-'),x=-x;
  22. if(x>9) write(x/10);
  23. putchar(x%10+'0');
  24. }
  25. inline void Start()//预处理每种摆放方案是否合法且用了几个国王
  26. {
  27. register int i;
  28. for(i=0;i<(1<<n);++i)
  29. {
  30. could[i]=1,tot[i]=0;
  31. for(int num=i,lst=0;num;lst=num&1,num>>=1)
  32. {
  33. if(num&1)//若当前一位摆放了国王
  34. {
  35. if(lst) could[i]=0;//若前一位摆放了国王,则此方案不合法
  36. ++tot[i];//将国王的使用数量加1
  37. }
  38. }
  39. }
  40. }
  41. inline int check(int x,int y)
  42. {
  43. return !((x&y)||((x<<1)&y)||(x&(y<<1)));//比较两行的国王是否会攻击到对方
  44. }
  45. int main()
  46. {
  47. register int i,j,k,l;
  48. read(n),read(m),Start(),f[0][0][0]=1;
  49. for(i=1;i<=n;++i)//核心代码
  50. for(j=0;j<(1<<n);++j)
  51. if(could[j]&&tot[j]<=m)
  52. for(k=tot[j];k<=m;++k)
  53. for(l=0;l<(1<<n);++l)
  54. if(could[l]&&check(j,l)) f[i][k][j]+=f[i-1][k-tot[j]][l];//进行转移,计算该行当前摆放方式的方案数
  55. LL ans=0;
  56. for(j=0;j<(1<<n);++j) ans+=f[n][m][j];//统计答案
  57. return write(ans),0;
  58. }

【BZOJ1087】[SCOI2005] 互不侵犯King(状压DP)的更多相关文章

  1. [BZOJ1087] [SCOI2005] 互不侵犯King (状压dp)

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

  2. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  3. 【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 ...

  4. BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP

    [题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...

  5. 互不侵犯king (状压dp)

    互不侵犯king (状压dp) 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.\(1\le n\ ...

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

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

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

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

  8. [SCOI2005]互不侵犯(状压DP)

    嗝~算是状压DP的经典题了~ #\(\mathcal{\color{red}{Description}}\) 在\(N×N\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻 ...

  9. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

  10. 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)

    洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...

随机推荐

  1. Jmeter 添加CSV Data set config 文件的相对路径及编码在Windows和Linux下的兼容性(转)

    简介: Jmeter实际上是不需要安装的,只需要有ApacheJMeter.jar.启动批处理文件(jmeter.bat或jmeter).配置文件(jmeter.properties.user.pro ...

  2. redis使用方法

    redis缓存服务器笔记 redis是一个高性能的key-value存储系统,能够作为缓存框架和队列 但是由于他是一个内存内存系统,这些数据还是要存储到数据库中的 作为缓存框架: create/upd ...

  3. angularJs1.x 版本中 uib-tabset 如何默认激活不同的标签页

     <uib-tabset> 默认有个active属性,根据官方文档,active的默认值是0,也就是说,默认显示索引为0的标签页,可以通过修改这个值来默认显示不同的索引的标签页. 示例: ...

  4. P4135 作诗

    传送门 分块 设sum[ i ] [ j ] 存从左边到第 i 块时,数字 j 的出现次数 f [ i ] [ j ] 存从第 i 块,到第 j 块的一整段的答案 那么最后答案就是一段区间中几块整段的 ...

  5. Python+Selenium----使用HTMLTestRunner.py生成自动化测试报告1(使用IDLE)

    1.说明 自动化测试报告是一个很重要的测试数据,网上看了一下,使用HTMLTestRunner.py生成自动化测试报告使用的比较多,但是呢,小白刚刚入手,不太懂,看了很多博客,终于生成了一个测试报告, ...

  6. Spring学习(一)IOC

     Spring是一站式框架: (1)Spring在javaee三层结构中,每一层都提供不同的解决技术. web层:SpringMVC service层:Spring的Ioc dao层:Spring的J ...

  7. javascript模块化编程规范

    一.javascript模块化编程规范: 二.关于commenjs规范和AMD规范: 根本不同:前者用于服务器端同步加载模块:后者是客户端异步加载模块. 同点:两者都有一个全局函数require(), ...

  8. jquery选择器大全参考

    在Dom 编程中我们只能使用有限的函数根据id 或者TagName 获取Dom 对象. 然而在jQuery 中则完全不同,jQuery 提供了异常强大的选择器用来帮助我们获取页面上的对象, 并且将对象 ...

  9. SpringBoot | 第二十六章:邮件发送

    前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...

  10. SpringBoot | 第二十五章:日志管理之自定义Appender

    前言 前面两章节我们介绍了一些日志框架的常见配置及使用实践.一般上,在开发过程中,像log4j2.logback日志框架都提供了很多Appender,基本上可以满足大部分的业务需求了.但在一些特殊需求 ...