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

  好像若干月前非常Naive地去写过DFS...

  然后其实作为状压DP是一道非常好的题啦><

  感觉直接无脑搞时间是下不来的 做了好几道预处理

  使得最后DP的过程中没有任何一条转移是无用的

  

  1. program bzoj1087;
  2. var i,x,n,k,j,p,q,t1,t2:longint;
  3. ans:int64;
  4. a:array[-..]of longint;
  5. b:array[-..,-..]of longint;
  6. c:array[-..,-..]of longint;
  7. f:array[..,-..,-..]of int64;
  8.  
  9. function check(x:longint):boolean;
  10. var las:longint;
  11. begin
  12. las:=;
  13. while x<> do
  14. begin
  15. if (x and =)and(las=) then exit(false);
  16. las:=x and ;
  17. x:=x >> ;
  18. end;
  19. exit(true);
  20. end;
  21.  
  22. function count(x:longint):longint;
  23. var tem:longint;
  24. begin
  25. tem:=;
  26. while x<> do
  27. begin
  28. inc(tem,x and );
  29. x:=x >> ;
  30. end;
  31. exit(tem);
  32. end;
  33.  
  34. function ok(x,y:longint):boolean;
  35. var i:longint;
  36. tmp:array[..,-..]of longint;
  37. begin
  38. for i:= downto do tmp[,i]:=x >> i and ;
  39. for i:= downto do tmp[,i]:=y >> i and ;
  40. for i:= to do if (tmp[,i]+tmp[,i]=)or(tmp[,i]+tmp[,i-]=)or(tmp[,i]+tmp[,i+]=) then exit(false);
  41. exit(true);
  42. end;
  43.  
  44. begin
  45. fillchar(b,sizeof(b),);
  46. fillchar(a,sizeof(a),);
  47. fillchar(c,sizeof(c),);
  48. readln(n,k);
  49. for i:= to << n- do if check(i) then
  50. begin
  51. x:=count(i);
  52. inc(b[x,]);b[x,b[x,]]:=i;
  53. inc(a[]);a[a[]]:=i;
  54. end;
  55. for i:= to a[] do
  56. for j:= to a[] do if ok(a[i],a[j]) then begin inc(c[a[i],]);c[a[i],c[a[i],]]:=a[j];end;
  57. fillchar(f,sizeof(f),);
  58. for i:= to k do
  59. for j:= to b[i,] do f[,i,b[i,j]]:=;
  60. for i:= to n do
  61. begin
  62. f[]:=f[];
  63. fillchar(f[],sizeof(f[]),);
  64. for j:= to k do
  65. for p:= to (n+) >> do if p<=j then
  66. begin
  67. q:=j-p;
  68. for t1:= to b[p,] do
  69. for t2:= to c[b[p,t1],] do inc(f[,j,b[p,t1]],f[,q,c[b[p,t1],t2]]);
  70. end;
  71. end;
  72. ans:=;
  73. for i:= to a[] do inc(ans,f[,k,a[i]]);
  74. writeln(ans);
  75. end.

[BZOJ1087][SCOI2005]互不侵犯King解题报告|状压DP的更多相关文章

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

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

  2. 状压入门--bzoj1087: [SCOI2005]互不侵犯King【状压dp】

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

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

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

  4. bzoj1087: [SCOI2005]互不侵犯King (codevs2451) 状压dp

    唔...今天学了状压就练练手... 点我看题 这题的话,我感觉算是入门题了QAQ... 然而我还是想了好久... 大致自己推出了方程,但是一直挂,调了很久选择了题解 坚持不懈的努力的调代码. 然后发现 ...

  5. [bzoj1087][scoi2005]互不侵犯king

    题目大意 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. 思路 首先,搜索可以放弃,因为这是一 ...

  6. BZOJ1087 [SCOI2005]互不侵犯King 状态压缩动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1087 题意概括 在n*n的棋盘上面放k个国王,使得他们互相无法攻击,问有多少种摆法. 题解 dp[ ...

  7. [BZOJ1076][SCOI2008]奖励关解题报告|状压DP

    你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝 ...

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

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

  9. BZOJ 1087:[SCOI2005]互不侵犯King(状压DP)

    [SCOI2005]互不侵犯King [题目描述] 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...

随机推荐

  1. 理解windows模型

    同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等).但是一般而言,我们在说同步.异步的时候,特指 ...

  2. 3dContactPointAnnotationTool开发日志(十六)

      调了一上午才发现是把下面这个函数: private float DivideTriangle(int []triangle,out int []outTriangle,List<Vector ...

  3. ZOJ 1909 I-Square

    https://vjudge.net/contest/67836#problem/I Given a set of sticks of various lengths, is it possible ...

  4. HDU 2068 Choose the best route

    http://acm.hdu.edu.cn/showproblem.php?pid=2680 Problem Description One day , Kiki wants to visit one ...

  5. python json 序列化

    如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过 ...

  6. idea超炫的自定义模板

    idea超炫的自定义模板   idea 有些快捷键 sout -> System.out.println() ,输入sout,idea能自动补全代码, 这种约定的快捷方式大大提高了效率, 而id ...

  7. VBA练习-复杂一点

    '日期添加 Sub addDate(d) Dim rg As Range, dd As Date d = Split(d, ) d = Replace(d, ".", " ...

  8. C++除法运算 // 静态断言

    1.C++中"/"运算:对两个整数做除法,结果仍为整数,如果它的商包含小数部分,则小树部分会被截除. C++ Primer 第五章 P130 2.静态断言(static_asser ...

  9. BZOJ 1025 游戏(分组背包)

    题目所谓的序列长度实际上就是各循环节的lcm+1. 所以题目等价于求出 一串数之和等于n,这串数的lcm种数. 由唯一分解定理可以联想到只要把每个素数的幂次放在一个分组里,然后对整体做一遍分组背包就行 ...

  10. (三)Redis列表List操作

    List全部命令如下: lset key index value # 将列表key下标为index的元素的值设置为value,当 index 参数超出范围,或对一个空列表(key不存在)进行lset时 ...