[BZOJ1087][SCOI2005]互不侵犯King
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相关推荐
- BZOJ 1087: [SCOI2005]互不侵犯King
二次联通门 : BZOJ 1087: [SCOI2005]互不侵犯King /*BZOJ 1087: [SCOI2005]互不侵犯King状压dp将每一行棋子的存在状态压成一个整数f[i][j][k] ...
- 【SCOI2005】【BZOJ1087】互不侵犯King(状压dp)
problem 在N×N的棋盘里面放K个国王 每个国王会攻击它周围的一圈共8个格子 使他们互不攻击,共有多少种摆放方案 N <= 9 solution 用01串表示某一行放置的情况 首先枚举当前 ...
- BZOJ 1087 SCOI2005 互不侵犯King 状压DP
题目大意:给定n*n的国际象棋棋盘.在上面放k个国王,要求国王之间互不攻击.求方案数 n<=⑨ 状压DP.将每一行的方案二进制压成一维,令f[i][j][k]为第i行用去j个国王状态为k的方案数 ...
- BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP
[题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...
- 状压DP【洛谷P1896】 [SCOI2005]互不侵犯
P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
- 洛谷-P1896 [SCOI2005]互不侵犯
链接:https://www.luogu.org/problemnew/show/P1896 题意: 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 ...
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...
- 【Luogu】P1896互不侵犯King(状压DP)
题目链接 真是可恶,被数据范围坑了一把.想要一遍AC的希望破灭了-- 以后大家在做状压DP的时候一定要开long long-- 设f[i][j][k]表示考虑前i行,总共放了j个King,第i行状态为 ...
- 洛谷P1896 [SCOI2005]互不侵犯 状压dp+位运算
题目链接:https://www.luogu.org/problem/P1896 题意:n*n的格子填数,每个数填放位置的周围(8个)不能有其他的数 n<=9 ,矩形状压 f[i][j][s], ...
最新文章
- 中国水环境治理市场需求前景与十四五战略规划建议报告2022版
- Dalvik Virtual Execution with SmaliVM
- 电脑一复制粘贴就卡死_油门突然卡死,踩刹车根本没用该怎么办?看看老司机怎么说...
- 牛客小白月赛2 D 虚虚实实 【欧拉图】【连通图】
- arm linux 进程页表,linux-kernel – ARM Linux页表项格式 – 未使用的位?
- 机器学习经典算法决策树原理详解(简单易懂)
- 如何给Xcode添加我们常用的插件呢?
- UVA10284 POJ2512 Chessboard in FEN【国际象棋】
- 自己动手实现一个简单的 IOC,牛皮!!
- Atitit 提升开发效率 设计简化 目录 1. 防止过度设计	1 2. 优先使用db和os的自带功能,防止垃圾代码膨胀	2 2.1. 定时调度,优先使用db定时和os的cron定时	2 2.2
- Renesas:RH850的FCL库移植与使用
- H264编码格式--图文解释
- 暨反欺诈建模场景实操
- matlab数学实验报告面积,MATLAB插值实验报告数学实验
- 转专业申请麦吉尔大学计算机,我在麦吉尔大学学习数学专业……
- 大数据技术具备哪些特点
- 分形--Cantor三分集
- django设置为中文语言
- 关于SVN 操作 提示文件已过时,请先update
- php 重写方法should be compatible with,php方法重写:Declaration of should be compatible with that_PHP教程...
热门文章
- 看google三篇论文的感触
- HTTPS 建立连接的详细过程
- USTC English Club Note20171014(2)
- 学长毕业日记 :本科毕业论文写成博士论文的神操作20170404
- 在matlab中intcon什么意思,GADST,你为何这么叼?(一)
- [scala-spark]8. RDD的实现和编程接口
- Qt修炼手册9_Ui名字空间及setupUi()原理解读
- PIC单片机入门_同步/异步通信技术基础
- 实验一 线性表、堆栈和队列的操作与实现
- BugkuCTF-Misc:隐写