题目大意

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

左下右上右下八个方向上附近的各一个格子,共8个格子。

思路

首先,搜索可以放弃,因为这是一个计数问题,正解几乎不可能是搜索。

我们考虑这样一个决策过程:对于每一行,我们决定放哪些格子。这个决策过程很明显满足无后效性和最优子结构,同时,根据上一行可以递推出这一行的所有可行方案。

所以,我们考虑使用动态规划。

怎么划分阶段呢?根据我们以上的推理,很显然可以根据行来划分阶段。

怎么转移呢?在转移的时候,我们要考虑放的king的个数,所以要把king的个数加入状态。其次,为了让king互不侵犯,我们要存储这一行里哪些格子放了king,用一个二进制状态存储,写入状态。

很容易写出转移方程。

f[i][j][s] += f[i-1][j-cnt[j]][pre] 事实上,这更像一个递推。

下面给出代码。

Code

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 10;
  4. const int maxs = (1 << 10) + 1;
  5. int n, k, stat[maxs], m = 0;
  6. bool mp[maxs][maxs];
  7. long long f[maxn][maxn * maxn][maxs];
  8. int ct[maxs];
  9. void dfs(int p, int cnt, int x) {
  10. if (p >= n || cnt > k)
  11. return;
  12. stat[m++] = x;
  13. ct[m - 1] = cnt;
  14. for (int i = p + 1; i < n; i++) {
  15. if (abs(p - i) > 1 || p == -1)
  16. dfs(i, cnt + 1, x | (1 << i));
  17. }
  18. }
  19. int main() {
  20. scanf("%d%d", &n, &k);
  21. dfs(0 - 1, 0, 0);
  22. for (int i = 0; i < m; i++) {
  23. for (int j = 0; j < m; j++) {
  24. mp[i][j] = mp[j][i] = (stat[i] & stat[j]) || (stat[i] >> 1 & stat[j]) ||
  25. (stat[j] >> 1 & stat[i])
  26. ? 0
  27. : 1;
  28. }
  29. }
  30. for (int i = 0; i < m; i++) {
  31. f[0][ct[i]][i] = 1LL;
  32. }
  33. for (int i = 1; i < n; i++) {
  34. for (int j = 0; j <= k; j++) {
  35. for (int now = 0; now < m; now++) {
  36. if (ct[now] > j)
  37. continue;
  38. for (int l = 0; l < m; l++) {
  39. if (mp[l][now] && ct[l] + ct[now] <= j) {
  40. f[i][j][now] += f[i - 1][j - ct[now]][l];
  41. }
  42. }
  43. }
  44. }
  45. }
  46. long long ans = 0;
  47. for (int i = 0; i < m; i++) {
  48. ans += f[n - 1][k][i];
  49. }
  50. printf("%lld", ans);
  51. return 0;
  52. }

[bzoj1087][scoi2005]互不侵犯king的更多相关文章

  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

    在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 好像若干月前非常Naive地去写过DFS... ...

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

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

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

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

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

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

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

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

  8. SCOI2005互不侵犯King

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

  9. 洛谷1377 M国王 (SCOI2005互不侵犯King)

    洛谷1377 M国王 (SCOI2005互不侵犯King) 本题地址:http://www.luogu.org/problem/show?pid=1377 题目描述 天天都是n皇后,多么无聊啊.我们来 ...

随机推荐

  1. JVM内存管理------垃圾搜集器参数精解

    本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...

  2. Quartz资源收藏

    项目中使用Quartz集群分享 : http://hot66hot.iteye.com/blog/1726143 发布 Quartz Job Scheduling Framework 中文 PDF 版 ...

  3. 【XLL 框架库函数】 TempActiveRow/TempActiveRow12

    创建一个包含所有激活工作表行的 XLOPER/XLOPER12 LPXLOPER TempActiveRow(WORD row); LPXLOPER12 TempActiveRow12(ROW row ...

  4. 解决log4j:WARN No appenders could be found for logger

    这个问题是因为我们的log4j.properties文件配置不够完整,所以我们给它配置齐了就不会再出现这个问题. log4j.properties不完整配置如下: log4j.rootLogger=D ...

  5. 【Jsoup网页解析】

    下载链接:http://jsoup.org/download 一.普通的请求方式(不带有cookie) 使用举例: 第一步: Connection conn=Jsoup.connect(url); 第 ...

  6. Win10 Migrate apps to the Universal Windows Platform (UWP)

    https://msdn.microsoft.com/en-us/library/mt148501.aspx

  7. 复制Eclipse工作空间设置

    将新建的workspace下的.metadata.plugins内容全部删除: 将原来的workspace下的.metadata.plugins内容除了org.eclipse.core.resourc ...

  8. File类基础

    File类的作用: Java的io包中定义了File类,用于对文件或文件夹的管理操作. File类只能够用于表示文件或文件夹的信息(属性)和对该文件或文件夹的删除创建操作 (不能对内容进行访问) 通过 ...

  9. textbox 和lable换行保存和显示

    前台: <asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine"& ...

  10. BZOJ2471 : Count

    考虑KMP,设$f[i][j][S]$表示还剩最低$i$位没有确定,目前KMP匹配到了$j$这个位置,前缀匹配情况是$S$,最终会匹配到哪里,中途匹配成功几次. 其中$S[i]$是一个pair< ...