problem

  • 在N×N的棋盘里面放K个国王
  • 每个国王会攻击它周围的一圈共8个格子
  • 使他们互不攻击,共有多少种摆放方案
  • N <= 9

solution

  • 用01串表示某一行放置的情况
  • 首先枚举当前做到第几行,以及当前一共放了几颗棋子。
  • 于是状态f[i][j][k]表示到第i行,一共放j个棋子(包括这之前的),且第i行的状态是k的方案数。
  • 再考虑转移。这一行肯定是由上一行的状态转移过来的,那么我们可以再枚举上一行的状态。
  • 很自然的,发现这会超时。每次枚举一种状态就需要2^9,两重循环已经快爆掉了!我们可以发现一件事情。比如n=5,我们每次枚举到的11111,11011,10111,01011这些状态都是无效的。那么我们可以先预处理一下对于每一行的所有可行的状态(就是不能有连续的1)。
  • 这样的效率仍然不高——我们还可以对于每种可行的状态i,j,预处理i和j是否能够相邻,这样我们在DP的时候,就可以O(1)来转移了。(这里也可以不预处理,每次直接判断ij能否相邻也可。)

最后,记得开long long。

codes

#include<iostream>
using namespace std;
const int maxn = 512;
typedef long long LL;
int c1[maxn], cnt[maxn], c2[maxn][maxn];
LL ans, f[10][100][maxn];
int main(){int n, m;cin>>n>>m;int all = (1<<n)-1;for(int i = 0; i <= all; i++){if((i&(i>>1))==0){c1[i] = 1;for(int x = i; x; x >>= 1) cnt[i]+= (x&1);}}for(int i = 0; i <= all; i++)if(c1[i])f[1][cnt[i]][i] = 1;for(int i = 1; i < n; i++){for(int j = 0; j <= all; j++)if(c1[j]){for(int k = 0; k <= all; k++)if(c1[k]){if(((j&k)==0)&&((j&(k>>1))==0)&&((j&(k<<1))==0)){for(int p = cnt[j]; p+cnt[k]<=m; p++)f[i+1][p+cnt[k]][k] += f[i][p][j];}}}}for(int i = 0; i <= all; i++)ans += f[n][m][i];cout<<ans<<"\n";return 0;
}

转载于:https://www.cnblogs.com/gwj1314/p/9444821.html

【SCOI2005】【BZOJ1087】互不侵犯King(状压dp)相关推荐

  1. BZOJ 1087 SCOI2005 互不侵犯King 状压DP

    题目大意:给定n*n的国际象棋棋盘.在上面放k个国王,要求国王之间互不攻击.求方案数 n<=⑨ 状压DP.将每一行的方案二进制压成一维,令f[i][j][k]为第i行用去j个国王状态为k的方案数 ...

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

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

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

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

  4. 【BZOJ1087】【codevs2451】互不侵犯,状压DP

    传送门1 传送门2 写在前面:第一次写状压DP,感觉还好,至少比数论好些,还有就是让我膜一发位运算-- 思路:一看数据范围n<=9而且是省选,就知道这个题九成是状态压缩,题目限制条件与上一行的摆 ...

  5. 洛谷P1896 互不侵犯【状压DP】

    题目链接:P1896 互不侵犯 分析:普通的状压DP再多加一维记个数,然后找到能转移到当前的状态更新答案: #include<bits/stdc++.h> using namespace ...

  6. BZOJ 1087: [SCOI2005]互不侵犯King

    二次联通门 : BZOJ 1087: [SCOI2005]互不侵犯King /*BZOJ 1087: [SCOI2005]互不侵犯King状压dp将每一行棋子的存在状态压成一个整数f[i][j][k] ...

  7. 【Luogu】P1896互不侵犯King(状压DP)

    题目链接 真是可恶,被数据范围坑了一把.想要一遍AC的希望破灭了-- 以后大家在做状压DP的时候一定要开long long-- 设f[i][j][k]表示考虑前i行,总共放了j个King,第i行状态为 ...

  8. 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II

    文章目录 --2020年12月20日(周日)------------------ 状压DP 一.最短Hamilton路径(模板题) 二.玉米田(P1879 [USACO06NOV]Corn Field ...

  9. [BZOJ1087][SCOI2005]互不侵犯King

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

  10. POJ3163 King of Fighters 状压DP/费用流

    回归后的第一篇blog,康复打板中 这种题我做了2个多小时..(反正我现在已经失去对题目难度的辨识了) 很容易想到O(mn2n)O(mn2n)O(mn2^n)的状压做法,但是超时,考虑优化,想到不正确 ...

最新文章

  1. react-native-image-picker 运用launchCamera直接调取摄像头的缺陷及修复
  2. JDK8对并发的新支持
  3. cad在哪里设置图幅大小_一看就懂!菜鸟也能快速入门CAD,关键掌握这4个诀窍...
  4. Api文档生成工具与Api文档的传播(pdf)
  5. 如何使用 React 和 React Hooks 创建一个天气应用
  6. 图像语义分割 -- FCN
  7. PostgreSQL数据库安装Version10.5
  8. Git flow常用命令
  9. java语言程序设计第二版课后答案吴倩_java语言程序设计课后答案 郞波 第二版 清华大学出版社...
  10. 【java学习之路】(java框架)001.Maven配置及使用
  11. Spring Boot入口类
  12. 从最小样本中识别鸟类
  13. 深度学习常用软件包和基本环境配置
  14. Django restframework中Serializer序列化器-用法详解
  15. 全新2021款 Jlink隔离器,ARM仿真器隔离,Jlink,Nu-link,ULINK的隔离,Cortex-M系列隔离仿真
  16. Vue 电商后台管理项目阶段性总结
  17. PostGIS教程七:几何图形(Geometry)
  18. mysql 如何对集合进行遍历
  19. MFC 句柄Hwnd 与 窗口Wnd的联系
  20. 网易有数海量任务调度和智能运维实践(整理)

热门文章

  1. 【LeetCode160】相交链表
  2. 【POJ - 2377】Bad Cowtractors (最大生成树,并查集)
  3. 【ZOJ - 2836 】Number Puzzle (容斥原理)
  4. 【POJ - 1556】The Doors (计算几何,线段相交)
  5. 【C语言实现反转数组】(用栈实现)51nod - 训练营
  6. 《python深度学习》代码中文注释
  7. python中long类型_浅谈python 四种数值类型(int,long,float,complex)
  8. 计算机专业用锐龙笔记本,轻松应对工作挑战——ThinkPad T14 锐龙版,适合办公的笔记本电脑...
  9. ehchache验证缓存过期的api_Ehcache缓存配置
  10. 判断一个字符串大写小写,和数字出现的次数