[SCOI2005] 互不侵犯
传送门:>Here<
给出一个n*n的棋盘($n \leq 9$),放$k$个骑士,每个骑士可以攻击相邻的八个方向。问所有骑士互不侵犯的摆放方案数。
解题思路
决策问题可以通过搜索解决,而DP就是记忆化搜索。而在这里,我们直接考虑整排的决策比较方便。
在搜索时我们需要利用到哪些信息来完成决策?显然能影响到当前决策的有上一排的各个骑士位置,还能用几个骑士。而上一排的各个骑士位置是一个布尔数组,转化为DP的话这就成为了DP的一个状态。数据范围小的时候,我们是可以直接将布尔数组转为二进制作为状态的。我们称这种DP方法为状态压缩DP。
分析DP的时间复杂度,一般是状态数量乘上转移的复杂度。这里状态数是$O(2^nnk)$,而转移时枚举上一行状态$O(2^n)$,故总复杂度为$O(2^{2n}n^3)$。
这样的复杂度是过不了的。而事实上,一行内的合法状态数远不足$2^n$,所以我们可以预处理出每一行的合法状态数,这样就能过了。
$Code$
/*By QiXingzhi*/
#include <cstdio>
#define N (4010)
#define r read()
#define INF (0x3f3f3f3f)
#define Max(a,b) (((a)>(b)) ? (a) : (b))
#define Min(a,b) (((a)<(b)) ? (a) : (b))
typedef long long ll;
#define int ll
using namespace std;
inline int read(){
int x = ; int w = ; register int c = getchar();
while(c ^ '-' && (c < '' || c > '')) c = getchar();
if(c == '-') w = -, c = getchar();
while(c >= '' && c <= '') x = (x << ) +(x << ) + c - '', c = getchar();
return x * w;
}
int n,K,tot,ans;
int sta[N],num[N],f[][N][];
void Dfs(int x, int cur, int sum){
if(x >= n){
++tot;
sta[tot] = cur;
num[tot] = sum;
f[][tot][sum] = ;
return;
}
Dfs(x+,cur,sum);
Dfs(x+,cur+(<<x),sum+);
}
#undef int
int main(){
#define int ll
n=r,K=r;
Dfs(,,);
for(int i = ; i <= n; ++i){
for(int j = ; j <= tot; ++j){
for(int k = ; k <= tot; ++k){
if(sta[j] & sta[k]) continue;
if(sta[j] & (sta[k] << )) continue;
if(sta[j] & (sta[k] >> )) continue;
for(int s = num[j]; s <= K; ++s){
f[i][j][s] += f[i-][k][s-num[j]];
}
}
}
}
for(int i = ; i <= tot; ++i) ans += f[n][i][K];
printf("%lld",ans);
return ;
}
[SCOI2005] 互不侵犯的更多相关文章
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[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皇后,多么无聊啊.我们来 ...
- 1087: [SCOI2005]互不侵犯King
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4276 Solved: 2471[Submit][ ...
- 洛谷 P1896 [SCOI2005]互不侵犯
洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...
- BZOJ1087 SCOI2005 互不侵犯King 【状压DP】
BZOJ1087 SCOI2005 互不侵犯King Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附 ...
- bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Descripti ...
- 状压DP【洛谷P1896】 [SCOI2005]互不侵犯
P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
- 洛谷P1896 [SCOI2005]互不侵犯King
P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...
- BZOJ 1087:[SCOI2005]互不侵犯King(状压DP)
[SCOI2005]互不侵犯King [题目描述] 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
随机推荐
- jqGrid之treeGrid及行拖拽
单纯的做个小记录 今天做功能用到了jqGrid里面的treeGrid,遇到几个问题,这里做下记录 treeGrid 树表格的应用在官网给出了很直白的例子: 1.http://blog.mn886.ne ...
- C#泛型创建实例
class Test<T> where T : new() { public static T Instance() { return new T(); } } 就上面这方法, 居然比ne ...
- 小小知识点(一)——利用电脑自带的BitLocker对磁盘加密
1.利用电脑自带的BitLocker可以对固定的或移动的磁盘加密 网上有很多的使用方法步骤,可参考百度经验:https://jingyan.baidu.com/article/636f38bb4fac ...
- pdf中内嵌字体问题
在提交论文pdf到IEEE时总要检查字体是否为内嵌的,查看pdf中所有字体及是否内嵌可查看:http://sinme.blog.sohu.com/120043575.html. 具体做法是: 在pdf ...
- 福州大学软件工程1816 | W班 第10次作业[软件工程实践总结]
作业链接 个人作业--软件工程实践总结 评分细则 本次由五个问题(每个十分)+创意照片(五分)+附加题(十分)组成 评分统计图 千帆竞发图 汇总成绩排名链接 汇总链接
- html总结:文本框填满表格
<style> input { width: 100%; }</style>
- Python之发邮件
使用模块yagmail(使用收藏的yagmail,现在的第三方模块不能解决中文乱码问题) import yagmail user='xxx@126.com' password='xxxxxx' #使用 ...
- Linux 典型应用之服务管理
crontab 定时任务 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下: minut ...
- Mysql 5.7 Windows 版本(zip)的安装简单过程
1. 下载zip包 https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.25-winx64.zip 2. 找一个目录解压缩 3. 简单进行安装: ...
- 重构客户注册-基于ActiveMQ实现短信验证码生产者
重构目标:将bos_fore项目中的CustomerAction作为短信消息生产者,将消息发给ActiveMQ,创建一个单独的SMS项目,作为短信息的消费者,从ActiveMQ获取短信消息,调用第三方 ...