1087: [SCOI2005]互不侵犯King

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 4130  Solved: 2390
[Submit][Status][Discuss]

Description

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

Input

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

Output

  方案数。

Sample Input

3 2

Sample Output

16
一开始看做和八皇后类似的打表,后来发现攻击范围和八皇后的并不同而且这道题目要求了必须放入指定数目的"国王"
数据范围并不是很大,标准的棋盘模型很容易联想到状压dp,关键就是切入点,用轮廓线的话不怎么好写,不妨逐行递推,我们用1表示这个格子放入了国王,
从上往下递推所以不必考虑下面的国王对上面的有影响,这样的状态是非法的,注意到dp时多次用到状态之间的关系,考虑提前打表节约时间。
由于限制了棋子的数目,相应的也要多加一维用于表示棋子数目,则显然  dp[i][j][k]+=dp[i-1][j-cnt[B]][A] ;
dp[i][j][k]表示第i行状态为k,总共放置了j个棋子时的方案个数。
复杂度O(N*M*2n*2n)  N<=9,复杂度合适
  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. using namespace std;
  6. #define LL long long
  7. LL dp[][][<<],cnt[];
  8. bool e[][],q[];
  9. int N,M;
  10. bool pd(int A,int B)
  11. {
  12. bool hurt[]; memset(hurt,,sizeof(hurt));
  13. for(int i=;i<;++i)
  14. if(A&(<<i)) hurt[i++]=hurt[i-+]=hurt[i+]=;
  15. for(int i=;i<;++i)
  16. if( (B&(<<i)) && hurt[i+]) return ;
  17. return ;
  18. }
  19. void pre()
  20. {
  21. for(int i=;i<(<<);++i){ int ss=;
  22. for(int j=;j<;++j) if(i&(<<j)) ss++;
  23. cnt[i]=ss;
  24. }
  25. for(int i=;i<(<<);++i){int ok=;
  26. for(int j=;j<;++j){
  27. if((i&(<<j))&&(i&(<<(j+)))){ok=;break;}
  28. }
  29. q[i]=ok;
  30. }
  31. for(int i=;i<(<<);++i){
  32. for(int j=;j<(<<);++j){
  33. if((!q[i])||(!q[j])) {e[i][j]=;}
  34. else {
  35. if(pd(i,j)) {e[i][j]=; }
  36. }
  37. }
  38. }
  39. }
  40. int main()
  41. {
  42. pre();
  43. int i,j,k;
  44. scanf("%d%d",&N,&M);
  45. dp[][][]=;
  46. for(i=;i<=N;++i)
  47. {
  48. for(k=;k<=M;++k)
  49. {
  50. for(int A=;A<(<<N);++A){
  51. for(int B=;B<(<<N);++B){
  52. if(e[A][B]&&k-cnt[B]>=){
  53. dp[i][k][B]+=dp[i-][k-cnt[B]][A];
  54. }
  55. }
  56. }
  57. }
  58. }LL ans=;
  59. for(i=;i<(<<N);++i) ans+=dp[N][M][i];
  60. printf("%lld\n",ans);
  61. return ;
  62. }

bzoj 1087 状压dp的更多相关文章

  1. bzoj 1879 状压dp

    879: [Sdoi2009]Bill的挑战 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 852  Solved: 435[Submit][Status ...

  2. BZOJ 2064 - 状压DP

    传送门 题目大意: 给两个数组, 数组中的两个元素可以合并成两元素之和,每个元素都可以分裂成相应的大小,问从数组1变化到数组2至少需要多少步? 题目分析: 看到数据范围\(n<=10\), 显然 ...

  3. BZOJ 4057 状压DP

    思路: 状压一下 就完了... f[i]表示选了的集合为i 转移的时候判一判就好了.. //By SiriusRen #include <cstdio> #include <cstr ...

  4. BZOJ 4565 状压DP

    思路: f[i][j][S]表示从i到j压成S状态 j-m是k-1的倍数 $f[i][j][S<<1]=max(f[i][j][S<<1],f[i][m-1][S]+f[m][ ...

  5. bzoj 1072状压DP

    1072: [SCOI2007]排列perm Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2293  Solved: 1448[Submit][St ...

  6. bzoj 1072 状压DP

    我们用w[i][j]来表示,i是一个二进制表示我们选取了s中的某些位,j表示这些位%d为j,w[i][j]则表示这样情况下的方案数,那么我们可以得到转移.w[i|(1<<k)][(j*10 ...

  7. bzoj 2669 状压DP

    因为最多有8个'X',所以我们可以用w[i][s]来表示现在我们填了前i个数,填的X的为S,因为每次新加进来的数都不影响前面的最小值,所以我们可以随便添加,这样就有了剩下所有位置的方案,每次都这样转移 ...

  8. bzoj 1076 状压DP

    我们设w[i][s]为当前到第i关,手中的物品为s的时候,期望得分为多少,其中s为二进制表示每种物品是否存在. 那么就比较容易转移了w[i][s]=(w[i-1][s']+v[j]) *(1/k),其 ...

  9. BZOJ 1231 状压DP

    思路: f[i][j] i表示集合的组成 j表示选最后一个数 f[i][j]表示能选的方案数 f[i|(1<< k)][k]+=f[i][j]; k不属于i j属于i且符合题意 最后Σf[ ...

随机推荐

  1. Oracle trigger 触发器

    触发器使用教程和命名规范 目  录触发器使用教程和命名规范 11,触发器简介 12,触发器示例 23,触发器语法和功能 34,例一:行级触发器之一 45,例二:行级触发器之二 46,例三:INSTEA ...

  2. 【转】阿里巴巴技术专家杨晓明:基于Hadoop技术进行地理空间分析

    转自:http://www.csdn.net/article/2015-01-23/2823687-geographic-space-base-Hadoop [编者按]交通领域正产生着海量的车辆位置点 ...

  3. 论文笔记:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

    ICML, 2015 S. Ioffe and C. Szegedy 解决什么问题(What) 分布不一致导致训练慢:每一层的分布会受到前层的影响,当前层分布发生变化时,后层网络需要去适应这个分布,训 ...

  4. C++中去掉string字符串中的\r\n等

    string imagedata;imagedata = “dudau\r\ndadafca\r\n” CString Image; Image = imagedata.c_str(); Image. ...

  5. Sql调试

    1 ,调试 普通sql语句, 直接  F11 2,调试存储过程  F11->F10执行到 存储过程语句 在按F11 跳转进入到Sql存储过程内

  6. 在python3下使用OpenCV 抓取摄像头图像并实时显示3色直方图

    以下代码为在Python3环境下利用OpenCV 抓取摄像头的实时图像, 通过OpenCV的 calHist函数计算直方图, 并显示在3个不同窗口中. import cv2 import numpy ...

  7. win764位英文版系统unicode编码问题

    出现的编码现象: 1.以*.vga格式的课件文件,当作好可读html之后,仍然不能播放,此时为Unicode编码所致: 2.在编辑TXT文档时,内容凡有中文,在保存时,会提示不能识别,当确认后,中文字 ...

  8. CSS Ul(列表样式)

    CSS Ul(列表样式) CSS列表属性作用如下: 设置不同的列表项标记为有序列表 设置不同的列表项标记为无序列表 设置列表项标记为图像 一.列表 在HTML中,有两种类型的列表: 无序列表 - 列表 ...

  9. 《Java程序设计》实验1实验报告

    20145318 <Java程序设计>实验1实验报告 实验题目 通过对500个数据进行操作,实现快速排序.选择排序.直接插入排序算法时间复杂度的比较:并在排序数据中快速查找某一数据,给出查 ...

  10. MR案例:路径过滤PathFilter

    问题描述:现有一批cookie日志,按照日期进行存放,如目录 “dir/2015-08-08” 下存放2015-08-08这一天的所有cookie.而目录 “/2015-08-08/” 下又根据数据文 ...