【题解】互不侵犯 SCOI 2005 BZOJ 1087 插头dp
以前没学插头dp的时候觉得这题贼难,根本不会做,学了才发现原来是一裸题。
用二进制表示以前的格子的状态,0表示没放国王,1表示放了国王。
假设当前位置为(x,y),需要记录的是(x-1,y-1)至(x,y-1)的信息,共n+1个点。
每个状态有两种决策,第一种是这个格子不放国王,直接转移。
第二种是这个格子放国王,需要满足几个条件才能进行这步转移,条件很显然,具体见代码和注释。
因为状态数很少,所以也用不到BFS转移状态和Hash的技巧,所以这题还是很清真的,细节不多,码量也很小。
#include <cstring>
#include <algorithm>
#include <cstdio> using namespace std;
typedef long long ll;
const int MAXN = ; int n, k; inline int getd( int x, int d ) { // 位运算相关
return (x>>d)&;
}
inline int setd( int x, int d, int v ) {
return (x&(~(<<d)))|(v<<d);
} ll f[][][]; // 滚动数组
void update_no( int cur, int kk, int S ) { // 不放国王
int nS = setd(S,n,)<<;
f[cur^][kk][nS] += f[cur][kk][S];
}
void update_yes( int cur, int kk, int S ) { // 放国王
int nS = (setd(S,n,)<<)|;
f[cur^][kk+][nS] += f[cur][kk][S];
}
void solve() {
int cur = ;
f[cur][][] = ;
for( int i = ; i < n; ++i )
for( int j = ; j < n; ++j ) {
memset( f[cur^], , sizeof(f[cur^]) );
for( int kk = ; kk <= k; ++kk )
for( int S = ; S < ; ++S )
if( f[cur][kk][S] ) {
update_no(cur,kk,S); // 任何格子都可以不放
if( ( !j || !getd(S,) ) && // 在第一列或者左边没有国王
( !i || !getd(S,n-) ) && // 在第一行或者上面没有国王
( !j || !i || !getd(S,n) ) && // 在第一行或者在第一列或者左上角没有国王
( j == n- || !i || !getd(S,n-) ) && // 在最后一列或者在第一行或者右上角没有国王
kk < k ) // 还有剩余的国王可以放
update_yes(cur,kk,S);
}
cur ^= ;
}
ll ans = ;
for( int S = ; S < ; ++S ) ans += f[cur][k][S];
printf( "%lld\n", ans );
} int main() {
scanf( "%d%d", &n, &k ), solve();
return ;
}
【题解】互不侵犯 SCOI 2005 BZOJ 1087 插头dp的更多相关文章
- 互不侵犯King(bzoj 1087)
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- [BZOJ1087][SCOI2005]互不侵犯King解题报告|状压DP
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 好像若干月前非常Naive地去写过DFS... ...
- 【BZOJ1187】[HNOI2007]神奇游乐园 插头DP
[BZOJ1187][HNOI2007]神奇游乐园 Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细 ...
- BZOJ 1087(SCOI 2005) 互不侵犯
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5333 Solved: 3101 [Submit][ ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Descripti ...
- SCOI 2005 互不侵犯
洛谷 P1896 [SCOI2005]互不侵犯 洛谷传送门 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一 ...
- 【BZOJ】【1087】【SCOI2005】互不侵犯King
状压DP 我写的太水了……64ms才过,估计还有更好的做法,希望各位神犇不吝赐教>_<. 嗯这题很明显每一行都可以用一个2进制数表示放置方式的,(1表示放,0表示不放).然后预处理一下所有 ...
- BZOJ 1087 互不侵犯king
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
随机推荐
- MR execution in YARN
Overview YARN provides API not for application developers but for the great developers working on ne ...
- 【算法分析】如何理解快慢指针?判断linked list中是否有环、找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 为例Python实现
引入 快慢指针经常用于链表(linked list)中环(Cycle)相关的问题.LeetCode中对应题目分别是: 141. Linked List Cycle 判断linked list中是否有环 ...
- Python3 集合
1.集合的表示 集合是一个无序不重复的元素序列 创建空集合 set() 2.集合的运算 a={1,2,3} b={2,3,4} print(a-b) #a中包含b中不包含 print(a|b) #a中 ...
- 理解glance
摘要: 本节介绍 OpenStack Image 服务 Glance 的基本概念. OpenStack 由 Glance 提供 Image 服务. 理解 Image 要理解 Image Service ...
- Python3 数据类型-列表
序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. 索引如下图: 列表命名(list): 组成:使用[]括起来,并且 ...
- HDU 2487 Ugly Windows(暴力)(2008 Asia Regional Beijing)
Description Sheryl works for a software company in the country of Brada. Her job is to develop a Win ...
- Alpha发布文案+美工
文案: Alpha发布文稿 我们是Hello World!团队,下面由我来简要介绍一下我们组的作品,我们组做的是一个飞机射击类游戏,名字叫做空天猎.这个游戏是基于JAVA平台创建的,那么接下来让我给大 ...
- 【Linux】- CentOS安装Mysql 5.7
CentOS7默认数据库是mariadb,而不是mysql.CentOS7的yum源中默认是没有mysql的.所以不能使用yum install直接安装. 下载mysql的repo源 cd /usr/ ...
- matplotlib中什么是后端
在很多网上文档和邮件列表中提到了"后端",并且很多初学者会对这个术语迷惑.matplotlib把不同使用情形和输出格式作为目标.一些人用matplotlib在python shel ...
- Spring Boot中使用@Transactional注解配置事务管理
事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编程式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP ...