SCOI 2005 互不侵犯
洛谷 P1896 [SCOI2005]互不侵犯
题目描述
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。
注:数据有加强(2018/4/25)
输入格式
只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)
输出格式
所得的方案数
输入输出样例
输入 #1复制
输出 #1复制
题解:
原谅我一开始看到题还以为是爆搜。。。
其实是一道状态压缩的题目。
蒟蒻自己一个比较大的进步就是把自己状态设置对了...
设置:\(dp[i][j][k]\)为第\(i\)行状态为\(j\)、已经用了\(k\)个国王时的方案数。
状态压缩大体有这么几步:设置状态\(\rightarrow\)考虑转移方式\(\rightarrow\)按转移方式考虑预处理和判断转移条件\(\rightarrow\)开始转移\(\rightarrow\)统计答案。
那么我们设置好状态,开始考虑转移方式:我们发现,若是想从第\(i-1\)行开始转移,转移的条件一是当前和上一次的状态,但是,这些状态的改变必然还会改变国王的个数。也就是说,这数组的两维是有联系的,是自变量和因变量的关系。所以我们因此想到,既然是自变量和因变量的关系,我们莫不如由此构建一个映射,存下来每个状态和每个状态需要的国王人数。这样我们转移的时候就没啥问题了。
如何预处理呢?我们想到,我们需要按行处理状态,每个状态有放国王和不放国王两种选择。因为是预处理,我们是肯定不能用递推和\(DP\)的(你想干啥)
所以我们考虑搜索。
一次搜索可以处理出所有合法的行的方式。
这里插一嘴,因为我们已经把所有合法的行的方式都求出来了,所以我们没必要再把\(dp\)数组的第二维开那么大,构建好映射关系之后,直接用\(cnt\)代替这个二进制状态即可。(因为\(1-cnt\)的每个数都对应着一个数组\(s[i]\)作为状态。)
然后再转移的时候进行判断是否合法就可以。
转移方程:
\]
这里的\(k,j\)分别表示一种状态。
代码:
#include<cstdio>
#define int long long
using namespace std;
int n,K,cnt,ans;
int s[100],num[100];
int dp[10][100][110];
//dp[i][j][k]表示前i-1行放完,第i行状态为j、有k个国王时的方案数
//状态0/1:0:国王攻击不到;1:被国王占领
void dfs(int pos,int st,int tot)
{
if(pos>=n)
{
s[++cnt]=st;
num[cnt]=tot;
return;
}
dfs(pos+1,st,tot);
dfs(pos+2,st+(1<<pos),tot+1);
}
signed main()
{
scanf("%lld%lld",&n,&K);
dfs(0,0,0);
for(int i=1;i<=cnt;i++)
dp[1][i][num[i]]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=cnt;j++)
for(int k=1;k<=cnt;k++)
{
if(s[j]&s[k])
continue;
else if(s[j]&(s[k]>>1))
continue;
else if(s[j]&(s[k]<<1))
continue;
else
for(int l=num[j];l<=K;l++)
dp[i][j][l]+=dp[i-1][k][l-num[j]];
}
ans=0;
for(int i=0;i<=cnt;i++)
ans+=dp[n][i][K];
printf("%lld",ans);
return 0;
}
SCOI 2005 互不侵犯的更多相关文章
- C++之路进阶——codevs2451(互不侵犯)
2451 互不侵犯 2005年省队选拔赛四川 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 在N×N的棋盘里 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- [bzoj1087][scoi2005]互不侵犯king
题目大意 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. 思路 首先,搜索可以放弃,因为这是一 ...
- 【状压DP】bzoj1087 互不侵犯king
一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. I ...
- BZOJ-1087 互不侵犯King 状压DP+DFS预处理
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...
- SCOI2005互不侵犯King
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1499 Solved: 872[Submit][S ...
- 洛谷1377 M国王 (SCOI2005互不侵犯King)
洛谷1377 M国王 (SCOI2005互不侵犯King) 本题地址:http://www.luogu.org/problem/show?pid=1377 题目描述 天天都是n皇后,多么无聊啊.我们来 ...
- CODEVS 2451 互不侵犯
2451 互不侵犯 题目描述 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格 ...
- 洛谷 P1896 互不侵犯King
P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...
随机推荐
- 解决 eclipse出现 Address already in use: bind,以及tomcat端口占用
在项目开发中,有时候我们发现回报这个错:解决 eclipse出现 Address already in use: bind 产生的原因是端口占用,比如你的8080端口,已经有一个进程在访问使用,但是你 ...
- WPF 精修篇 样式继承
原文:WPF 精修篇 样式继承 这个 是新知识 样式可以继承 <Style x:Key="TextBlockStyleBase" TargetType="{x:Ty ...
- C语言的指针用法:输入一堆字符,把非字母的删去。
char *p,a[20]; int i; gets(a); //这个语句不同于getchar(),后者只能一次输入一个,而前者可以一次输完所有的字符!!! p=a; //这个语句 ...
- Codeforces Round #599 (Div. 2) B2. Character Swap (Hard Version) 构造
B2. Character Swap (Hard Version) This problem is different from the easy version. In this version U ...
- Python程序中的线程操作-守护线程
目录 一.守护线程 1.1 详细解释 1.2 守护线程例1 1.3 守护线程例2 一.守护线程 无论是进程还是线程,都遵循:守护xx会等待主xx运行完毕后被销毁.需要强调的是:运行完毕并非终止运行. ...
- TensorFlow中实现RNN,彻底弄懂time_step
这篇博客不是一篇讲解原理的博客,这篇博客主要讲解tnesorlfow的RNN代码结构,通过代码来学习RNN,以及讲解time_steps,如果这篇博客没有让你明白time_steps,欢迎博客下面评论 ...
- 五分钟搞定 HTTPS 配置,二哥手把手教
01.关于 FreeSSL.cn FreeSSL.cn 是一个免费提供 HTTPS 证书申请.HTTPS 证书管理和 HTTPS 证书到期提醒服务的网站,旨在推进 HTTPS 证书的普及与应用,简化证 ...
- 使用Redis实现最近N条数据的决策
前言 很多时候,我们会根据用户最近一段时间的行为,做出一些相应的策略,从而改变系统的运动轨迹. 举个简单的例子来说明一下: 假设A公司现在有两个合作伙伴(B和C),B和C都是提供天气数据的,现在A公司 ...
- ros相机标定
没有经过校准的camera拍摄的图片是有畸变的.如下图: 而我们希望得到的图片是这样的 ros中提供了一个程序camera_calibration帮助我们去做校准. 具体怎么校准参考 https:// ...
- oracle学习笔记(十二) 查询练习(二) 高级查询
高级查询练习 /*--------------------------------------------- 分组查询 -------------------------------------*/ ...