状压DP【p1896】[SCOI2005]互不侵犯
Description
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。
Input
只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)
Output
所得的方案数
很明显\(N \leq 9\)状压DP啊 qwq.
这里有限制,我们只能放\(K\)个国王,并且如果一个格子有国王,其周围八个格子都不能放.
设状态\(f[i][j][k]\)代表前\(i\)行中第\(i\)行为\(j\)状态下共放了\(k\)个国王的方案数.
状态转移的话,我们当前行显然已经放了国王.
因此,转移可以很容易想到.
\]
其中\(l\)为枚举的上一行所放的国王的个数,\(k\)为枚举的上一行的状态,\(calc(j)\)为计算\(j\)状态下有多少个国王被放置.
判断合法与否的话,只需要判断一下当前\(j\)状态与\(k\)状态\(&\)起来是否为零。
如何判断状态合法
判断是否\(j\)状态的某一位置右上方有无国王.
\]
同理左上方
\]
正上方
\]
这几个方向是相对而言的.且我们从第\(1\)行到第\(n\)行放置的话,每次判断是否合法达到了判断6个方向的效果.
判断左右两侧当然是最简单的了
\]
代码
#include<cstdio>
#define int long long
#define R register
using namespace std;
int n,m,f[10][2048][108];
int lim,ans;
inline bool ok(int i)
{
return ((i&(i<<1))==0 and (i&(i>>1))==0);
}//相邻方向.
inline int calc(int x)
{
int res=0;
for(R int i=0;(1<<i)<=x;i++)
res+=(bool)(x&(1<<i));
return res;
}
signed main()
{
scanf("%lld%lld",&n,&m);
f[0][0][0]=1;
lim=(1<<n)-1;
for(R int i=1;i<=n;i++)
{
for(R int j=0;j<=lim;j++)
{
if(!ok(j))continue;
for(R int k=0;k<=lim;k++)
{
if(!ok(k))continue;
if((j&k)==0 and ((j<<1)&k)==0 and ((j>>1)&k)==0)
{
R int now=calc(j);
for(R int l=0;l<=m;l++)
f[i][j][l+now]+=f[i-1][k][l];
}
}
}
}
for(R int i=0;i<=lim;i++)
ans+=f[n][i][m];
printf("%lld\n",ans);
}
可以滚动数组滚掉第\(1\)维,切在枚举\(l\)的时候,第三维可能会超内存,因此要开大一点.当然也可以判断一下\(l+now \leq m\)
状压DP【p1896】[SCOI2005]互不侵犯的更多相关文章
- 状压入门--bzoj1087: [SCOI2005]互不侵犯King【状压dp】
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行, ...
- 【状压DP】bzoj1087 互不侵犯king
一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. I ...
- 洛谷 P1896 [SCOI2005]互不侵犯
洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...
- 洛谷——P1896 [SCOI2005]互不侵犯
P1896 [SCOI2005]互不侵犯 状压DP入门题 状压DP一般需要与处理状态是否合法,节省时间 设定状态dp[i][j][k]表示第i行第j个状态选择国王数为k的方案数 $dp[i][j][n ...
- 洛谷P1896 [SCOI2005]互不侵犯King
P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...
- 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)
洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...
- P1896 [SCOI2005]互不侵犯 状压dp
正解:状压dp 解题报告: 看到是四川省选的时候我心里慌得一批TT然后看到难度之后放下心来觉得大概没有那么难 事实证明我还是too young too simple了QAQ难到爆炸TT我本来还想刚一道 ...
- P1896 [SCOI2005]互不侵犯King
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入输出格式 输入格式: 只有一行,包 ...
- P1896 [SCOI2005]互不侵犯
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 注:数据有加强(2018/4/25) ...
- P1896 [SCOI2005] 互不侵犯 方法记录
原题链接 [SCOI2005] 互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
随机推荐
- Linux编译安装与配置-MySQL(5.5,5.6)版本系(笔记)
MySQL 5.5(5.6)后版本,需要使用cmake(Cross make , https://cmake.org/ )编译 我的环境如下: VMWare虚拟机,CentOS 5.5 x86_64( ...
- Python 基础学习篇
注:技术尚浅,时间匆忙,如有错误或者不当之处值得商榷的,请留言,吾必思而改之. 第一篇 :Python基础- 安装/变量/输入/及循环语句使用 第二篇: Python基础- 常用数据类型 第三篇: ...
- CentOS下Apache虚拟主机配置
通过phpinfo可以看到Apache安装的目录 修改配置文件,首先将配置文件备份 编辑httpd.conf,并找到虚拟路径配置的部分 vi httpd.conf 在vi下先按esc在键入 :/vho ...
- 【bzoj4146】[AMPPZ2014]Divisors 数论
原文地址:http://www.cnblogs.com/GXZlegend/p/6801411.html 题目描述 给定一个序列a[1],a[2],...,a[n].求满足i!=j且a[i]|a[j] ...
- Codeforces Round #389 (Div. 2) 752F(树的权值重心)
题目大意 给定2k个队伍分别住在2k个城市里,需要设定若干个城市,然后选取2个队伍要在它们的最短路径上设一个城市作为休息站 要求设立最少的休息站,然后输出如何安排2个队伍 首先若干个其实就是在坑人,实 ...
- [AGC010E] Rearranging [拓扑排序+堆]
题面 传送门 思路 首先,一个显然的结论是:Alice调整过后的序列中任意两个不互质的数的相对顺序无法改变 那么我们可以以这个性质为突破口 我们在两个不互质的权值的点之间连一条边(没错这是个图论题!! ...
- 洛谷树剖模板题 P3384 | 树链剖分
原题链接 对于以u为根的子树,后代节点的dfn显然比他的dfn大,我们可以记录一下回溯到u的dfn,显然这两个dfn构成了一个连续区间,代表u及u的子树 剩下的就和树剖一样了 #include< ...
- BZOJ2435 [Noi2011]道路修建 【树形Dp 吧。。】
题目 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1条双向道路. 每条道路的修 ...
- TCP面试题之四次挥手过程
TCP四次挥手过程: 1.第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态: 2.第二次挥手:Server收到FIN后,发 ...
- atan 和 atan2
转自http://blog.csdn.net/chinabinlang/article/details/6802686 atan函数与atan2函数的一点区别 . atan 和 atan2 都是求反 ...