以前没学插头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的更多相关文章

  1. 互不侵犯King(bzoj 1087)

    Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...

  2. [BZOJ1087][SCOI2005]互不侵犯King解题报告|状压DP

    在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 好像若干月前非常Naive地去写过DFS... ...

  3. 【BZOJ1187】[HNOI2007]神奇游乐园 插头DP

    [BZOJ1187][HNOI2007]神奇游乐园 Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细 ...

  4. BZOJ 1087(SCOI 2005) 互不侵犯

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5333 Solved: 3101 [Submit][ ...

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

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

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

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

  7. SCOI 2005 互不侵犯

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

  8. 【BZOJ】【1087】【SCOI2005】互不侵犯King

    状压DP 我写的太水了……64ms才过,估计还有更好的做法,希望各位神犇不吝赐教>_<. 嗯这题很明显每一行都可以用一个2进制数表示放置方式的,(1表示放,0表示不放).然后预处理一下所有 ...

  9. BZOJ 1087 互不侵犯king

    Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...

随机推荐

  1. 创新手机游戏《3L》开发点滴(3)——道具、物品、装备表设计 V2(最终版)

    我们正在开发一款新手游,里面有道具,之前也写了一篇博文记录了下我们的设计思路,但是国庆到了,于是我有了时间继续纠结这个问题. 其实我主要是在到底是用mysql还是mongodb上纠结.这个复杂.痛苦. ...

  2. [leetcode-670-Maximum Swap]

    Given a non-negative integer, you could swap two digits at most once to get the maximum valued numbe ...

  3. Memcache+Cookie解决分布式系统共享登录状态

    Memcached高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度.Memcached能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等. Memc ...

  4. Java常用类之String

    String 类: 1. java.lang.String 类代表不可变的字符序列:  2. “XXX” 为该类的一个对象: 3. String 类的常用构造方法: ① String(String o ...

  5. TCP系列05—连接管理—4、TCP连接的ISN、连接建立超时及TCP的长短连接

    一.TCP连接的ISN         之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不同实例(di ...

  6. NeoLoad系列- 快速上手教程

    1.新建工程 2.点击录制脚本按钮 3.在弹出的开始录制对话框中,填写虚拟用户信息. Record in下拉框,用来填写用户路径,一般有三个容器组成: Init, Actions, and End.当 ...

  7. phpcms黄页,不能选择行业。解决办法

    用phpcms黄页模块,发布产品的时候.不能选择 产品分类,点开之后,啥都没有,是空的. 这个是因为:js的问题. 解决办法:将 网站根目录的 js 文件中的两个文件,更换为 官方的两个js文件.即可 ...

  8. 重载和const参数

    const仅能用于在定义函数签名时,区分是为引用定义参数,还是为指针定义参数.定义基本类型type(如int等),从重载的观点来看,const int和int是相同的. const long& ...

  9. WebExtensions & tabs.executeScript()

    tabs.executeScript() https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs ...

  10. BZOJ4810 Ynoi2017由乃的玉米田(莫队+bitset)

    多组询问不强制在线,那么考虑莫队.bitset维护当前区间出现了哪些数,数组记录每个数的出现次数以维护bitset.对于乘法,显然应有一个根号范围内的因子,暴力枚举即可.对于减法,a[i]-a[j]= ...