传送门:>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] 互不侵犯的更多相关文章

  1. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  2. SCOI2005互不侵犯King

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1499  Solved: 872[Submit][S ...

  3. 洛谷1377 M国王 (SCOI2005互不侵犯King)

    洛谷1377 M国王 (SCOI2005互不侵犯King) 本题地址:http://www.luogu.org/problem/show?pid=1377 题目描述 天天都是n皇后,多么无聊啊.我们来 ...

  4. 1087: [SCOI2005]互不侵犯King

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4276  Solved: 2471[Submit][ ...

  5. 洛谷 P1896 [SCOI2005]互不侵犯

    洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...

  6. BZOJ1087 SCOI2005 互不侵犯King 【状压DP】

    BZOJ1087 SCOI2005 互不侵犯King Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附 ...

  7. bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Descripti ...

  8. 状压DP【洛谷P1896】 [SCOI2005]互不侵犯

    P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...

  9. 洛谷P1896 [SCOI2005]互不侵犯King

    P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...

  10. BZOJ 1087:[SCOI2005]互不侵犯King(状压DP)

    [SCOI2005]互不侵犯King [题目描述] 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...

随机推荐

  1. BOM基础 计时器 定时器 DOM 基础

    -------------------------------------------滴水穿石,我心永恒. day48 CSSJS 1 ECMA script 2 BOM browser object ...

  2. Go源码编译安装

    参考文档1:https://www.cnblogs.com/majianguo/p/7258975.html 参考文档2:http://www.loongson.cn/news/company/456 ...

  3. c++入门之命名空间存在的意义

    看过鸡啄米的C++编程入门系列教程的朋友,应该能注意到,在其中的很多实例中,都有这么一条语句:using namespace std;,即使用命名空间std,其作用就是规定该文件中使用的标准库函数都是 ...

  4. js中的join(),reverse()与 split()函数用法解析

    <script> /* * 1:arrayObject.reverse() * 注意: 该方法会改变原来的数组,而不会创建新的数组.此函数可以将数组倒序排列 * 2:arrayObject ...

  5. CentOS7源码升级OpenSSL和OpenSSH

    一.CentOS7升级OpenSSL 1.查看ssl版本及下载相关依赖包 openssl version -a yum install -y gcc openssl-devel pam-devel r ...

  6. Pair Project

    以前只是一个人完成一个项目,不论什么都是,现在突然要两个人一起来写, 听上去挺稀奇的,也挺简单的,可惜了就是“听上去”而已.我认为这也是一种技术啊~ 我跟我的搭档研究了好久好久,选择了好久,然后也选了 ...

  7. Linux之磁盘挂载

    1.查看磁盘分区情况: fdisk -l 可以看到,红框中的硬盘没有分区. 2.开始分区: fdisk /dev/vdb 3.格式化分区: mkfs.xfs 分区名 4.挂载磁盘 挂载方式1: 手动挂 ...

  8. 【翻译】asp.net core中使用FluentValidation来进行模型验证

    asp.net core中使用FluentValidation FluentValidation 可以集成到asp.net core中.一旦启用,MVC会在通过模型绑定将参数传入控制器的方法上时使用F ...

  9. PreparedStatement和Statement

    1 . PreparedStatement 接口继承 Statement , PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2  ...

  10. hashCode和equals的关系分析

    hashCode:说白了,简单的就看做一个函数,但是该函数有可能出现:对于某个x值,存在不止一个y值与之对应.这种情况就叫哈希碰撞. 那么: 1.如果hashCode相等,两个对象不一定是同一个对象( ...