Description

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

Input

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

Output

  方案数。

Sample Input

3 2

Sample Output

16

Solution

  • 看到 N≤9N\leq9 , 经典的状压DP。

  • 设 F[i][j][s]F[i][j][s] 表示当前做到第 ii 行、已经放了 jj 个国王、且第 ii 行国王的放置方式为二进制状态 ss 的方案数。

  • 那么显然有:

    F[i][j][s]+=F[i−1][j−num][s′]

    F[i][j][s]+=F[i-1][j-num][s’]

  • 最后的答案即为:F[n][k][s]F[n][k][s] (其中 s<script type="math/tex" id="MathJax-Element-658">s</script> 为一行的放置状态)

  • 转移的状态可以通过预处理来先求出,DP也可以改成滚动的,以优化空间。

Code

#include<cstdio>
#include<cstring>
using namespace std;
const int N=(1<<9)+1;
int n,m,k,roll;
long long ans;
int cnt[N],num[N],p[10];
long long f[2][82][N];
bool bz[N][N];
inline void dfs(int x,int last,int s)
{cnt[++m]=s,num[m]=x;if(x==k || x==(n+1)>>1) return;for(int i=last+2;i<=n;i++) dfs(x+1,i,s+p[i-1]);
}
int main()
{scanf("%d%d",&n,&k);for(int i=p[0]=1;i<=n;i++) p[i]=p[i-1]<<1;dfs(0,-1,0);for(int i=1;i<=m;i++)for(int j=1;j<=m;j++)bz[i][j]=bz[j][i]=!(cnt[i]&cnt[j] || cnt[i]<<1&cnt[j] || cnt[i]>>1&cnt[j]);for(int i=1;i<=m;i++) f[roll][num[i]][i]=1;for(int i=2;i<=n;i++){roll^=1;memset(f[roll],0,sizeof(f[roll]));for(int j=0;j<=k;j++)for(int l=1;l<=m;l++)if(num[l]<=j)for(int c=1;c<=m;c++)if(bz[l][c] && num[l]+num[c]<=j)f[roll][j][l]+=f[roll^1][j-num[l]][c];}for(int i=1;i<=m;i++) ans+=f[roll][k][i];printf("%lld",ans);return 0;
}

[BZOJ1087][SCOI2005]互不侵犯King相关推荐

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

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

  2. 【SCOI2005】【BZOJ1087】互不侵犯King(状压dp)

    problem 在N×N的棋盘里面放K个国王 每个国王会攻击它周围的一圈共8个格子 使他们互不攻击,共有多少种摆放方案 N <= 9 solution 用01串表示某一行放置的情况 首先枚举当前 ...

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

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

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

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

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

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

  6. 洛谷-P1896 [SCOI2005]互不侵犯

    链接:https://www.luogu.org/problemnew/show/P1896 题意: 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 ...

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

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

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

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

  9. 洛谷P1896 [SCOI2005]互不侵犯 状压dp+位运算

    题目链接:https://www.luogu.org/problem/P1896 题意:n*n的格子填数,每个数填放位置的周围(8个)不能有其他的数 n<=9 ,矩形状压 f[i][j][s], ...

最新文章

  1. 中国水环境治理市场需求前景与十四五战略规划建议报告2022版
  2. Dalvik Virtual Execution with SmaliVM
  3. 电脑一复制粘贴就卡死_油门突然卡死,踩刹车根本没用该怎么办?看看老司机怎么说...
  4. 牛客小白月赛2 D 虚虚实实 【欧拉图】【连通图】
  5. arm linux 进程页表,linux-kernel – ARM Linux页表项格式 – 未使用的位?
  6. 机器学习经典算法决策树原理详解(简单易懂)
  7. 如何给Xcode添加我们常用的插件呢?
  8. UVA10284 POJ2512 Chessboard in FEN【国际象棋】
  9. 自己动手实现一个简单的 IOC,牛皮!!
  10. Atitit 提升开发效率 设计简化 目录 1. 防止过度设计 1 2. 优先使用db和os的自带功能,防止垃圾代码膨胀 2 2.1. 定时调度,优先使用db定时和os的cron定时 2 2.2
  11. Renesas:RH850的FCL库移植与使用
  12. H264编码格式--图文解释
  13. 暨反欺诈建模场景实操
  14. matlab数学实验报告面积,MATLAB插值实验报告数学实验
  15. 转专业申请麦吉尔大学计算机,我在麦吉尔大学学习数学专业……
  16. 大数据技术具备哪些特点
  17. 分形--Cantor三分集
  18. django设置为中文语言
  19. 关于SVN 操作 提示文件已过时,请先update
  20. php 重写方法should be compatible with,php方法重写:Declaration of should be compatible with that_PHP教程...

热门文章

  1. 看google三篇论文的感触
  2. HTTPS 建立连接的详细过程
  3. USTC English Club Note20171014(2)
  4. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170404
  5. 在matlab中intcon什么意思,GADST,你为何这么叼?(一)
  6. [scala-spark]8. RDD的实现和编程接口
  7. Qt修炼手册9_Ui名字空间及setupUi()原理解读
  8. PIC单片机入门_同步/异步通信技术基础
  9. 实验一 线性表、堆栈和队列的操作与实现
  10. BugkuCTF-Misc:隐写