【题解】互不侵犯 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 只有一行,包 ...
随机推荐
- 浅谈java中接口与抽象类之间的异同
刚学习java的时候,总觉得接口和抽象类很像,但又说不上具体有什么区别.今天静下来,翻翻书,查查资料,做个小结.首先举两个例子,看看interface和abstract class 在“外形”上有啥异 ...
- Visaul Studio 密钥
vs professional 2015 简体中文版 :HMGNV-WCYXV-X7G9W-YCX63-B98R2
- BOM / URL编码解码 / 浏览器存储
BOM 浏览器对象模型 BOM(Browser Object Model) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的.可以与浏览器窗口进行互动的 ...
- Kali渗透测试-SNMP
1.snmpwalk -v指定snmpwalk版本 -c指定密码 2.snmp-check 获取系统信息,主机名,操作系统及架构 获取用户账户信息 获取网络信息 获取网络接口信息 IP信息 路由信息 ...
- 2018-9-25kanboard安装及使用
2018-9-25kanboard安装及使用 教程 小书匠 欢迎走进zozo的学习之旅. 简介 运行官方docker容器 使用kanboard 简介 Kanboard的安装提供了两种方式一种是直接安 ...
- TCP系列15—重传—5、Linux中RTO的计算
之前我们介绍的都是协议中给出的RTO计算方法,下面我们看一下linux实现中RTO的计算方法.在linux中维护了srtt.mdev.mdev_max.rttvar.rtt_seq几个状态变量用来计算 ...
- grid++json页面数据传入
最近遇到一个问题,就是要用Grid++做页面数据报表打印,但是翻了Grid++文档就是没有直接从页面上传数据的,都是要加载txt文档,填写txt文档的url.自己尝试直接页面上传JSON数据到Grid ...
- Pandas速查手册中文版(转)
关键缩写和包导入 在这个速查手册中,我们使用如下缩写: df:任意的Pandas DataFrame对象 同时我们需要做如下的引入: import pandas as pd 导入数据 pd.read_ ...
- html的body内标签之图片及表格
<li> list 标签定义和用法: <li> 标签定义列表项目. <li> 标签可用在有序列表 (<ol>) 和无序列表 (<ul>) 中 ...
- Oracle数据库表被锁定以及去除方式
select t2.username, t2.sid, t2.serial#, t3.object_name, t2.OSUSER, t2.MACHINE, t2.PROGRAM, t2.LOGON_ ...