状压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个格子 ...
随机推荐
- 程序员必备PC维修法(软件篇)
学会使用专业软件检测与修复电脑硬件故障问题也是程序员的一种软技能. windows篇 情景:如何获取电脑硬件的真实信息.(如何检验选购回来的硬件是否正品) 自检:使用AIDA64软件检查电脑硬件,能详 ...
- 孤荷凌寒自学python第五十五天初识MongoDb数据库
孤荷凌寒自学python第五十五天第一天初识MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 大家好,2019年新年快乐! 本来我想的是借新年第一天开始,正式尝试学习爬虫,结果今天偶然发现 ...
- winform 路径
System.AppDomain.CurrentDomain.BaseDirectory d:\project\bin\release\
- Nginx简单的配置详情
大致了解Nginx后,直接从配置文件入手: [shell] #定义Nginx运行的用户和用户组 user nginx; #nginx进程数,建议设置为等于CPU总核心数. worker_process ...
- (总结)统计Apache或Nginx访问日志里的独立IP访问数量的Shell
1.把IP数量直接输出显示:cat access_log_2011_06_26.log |awk '{print $1}'|uniq -c|wc -l 2.把IP数量输出到文本显示:cat acces ...
- 开头什么的肯定要自我介绍然后把它扔到置顶咯>_<~
大家嚎,我是NanoApe~ 现在高一,是个OIer.音游狗和一个爱着二次元的萌汉子妹子,欢迎前来勾搭>_<~ 最近就是要冲省队啦~~~~加油! 扣扣号:879006461 Weibo:伪 ...
- 洛谷 P4882 lty loves 96! 解题报告
P4882 lty loves 96! 题目背景 众所周知,\(lty\)非常喜欢\(96\)这两个数字(想歪的现在马上面壁去),更甚于复读(人本复)! 题目描述 由于爱屋及乌,因此,\(lty\)对 ...
- 洛谷 P2609 [ZJOI2012]数列 解题报告
P2609 [ZJOI2012]数列 题目描述 小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式: A(0)=0 A(1)=1 A(2i)=A(i) (对于任意 i>0 ...
- input输入限制(持续更新)
1.只读文本框内容 <!-- 在input里添加属性值 readonly --> <input type="text" value="" re ...
- c#后的完整cookie
http://www.cnblogs.com/top5/archive/2010/04/11/1709457.html c#设置 webbrowser的请求cookie,可以通过fiddler分析co ...