互不侵犯king (状压dp)
互不侵犯king (状压dp)
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。\(1\le n\le 9,0\le k\le n*n\)。
这道题如果普通dfs肯定会超时。为什么呢?我们发现一行中的状态是固定的,同时行与行之间的冲突情况也是固定的。而dfs重复枚举了每一行的状态,重复判断了这一行的状态是否与前一行相冲突。于是我们预处理出一行中的状态,同时预处理出两行状态的冲突情况,然后dp就行了。\(f[i][j][k]\)表示枚举到第i行,有j个国王,当前行状态的编号为k。它只能通过不与k冲突的上一行转移而来。于是就过了。
#include <cstdio>
using namespace std;
long long st[100];
int cnt[100], now[10], map[100][100];
int n, k, cntst;
long long f[10][100][100];
void dfs(int pos){
now[pos]=1;
long long tmp=0; ++cntst;
for (int i=1; i<=n; ++i){
tmp=(tmp<<1)+now[i];
cnt[cntst]+=now[i];
}
st[cntst]=tmp;
for (int i=pos+2; i<=n; ++i) dfs(i);
now[pos]=0;
}
int main(){
scanf("%d%d", &n, &k);
st[0]=0; cnt[0]=0;
for (int i=1; i<=n; ++i) dfs(i);
for (int i=0; i<=cntst; ++i)
for (int j=0; j<=cntst; ++j)
if ((st[i]&st[j])==0&&
((st[i]<<1)&st[j])==0&&
((st[i]>>1)&st[j])==0){
map[i][j]=1; map[j][i]=1;
}
f[0][0][0]=1;
for (int i=1; i<=n; ++i)
for (int j=0; j<=k; ++j)
for (int st=0; st<=cntst; ++st){
if (cnt[st]>j) continue;
for (int st2=0; st2<=cntst; ++st2){
if (!map[st][st2]) continue;
f[i][j][st]+=f[i-1][j-cnt[st]][st2];
}
}
long long ans=0;
for (int i=0; i<=cntst; ++i)
ans+=f[n][k][i];
printf("%lld", ans);
return 0;
}
互不侵犯king (状压dp)的更多相关文章
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- BZOJ-1087 互不侵犯King 状压DP+DFS预处理
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...
- bzoj1087 互不侵犯King 状压dp+bitset
题目传送门 题目大意:中文题面. 思路:又是格子,n又只有9,所以肯定是状压dp,很明显上面一行的摆放位置会影响下一行,所以先预处理出怎样的二进制摆放法可以放在上下相邻的两行,这里推荐使用bitset ...
- 【BZOJ1087】 [SCOI2005]互不侵犯King 状压DP
经典状压DP. f[i][j][k]=sum(f[i-1][j-cnt[k]][k]); cnt[i]放置情况为i时的国王数量 前I行放置情况为k时国王数量为J #include <iostre ...
- [BZOJ1087] [SCOI2005] 互不侵犯King (状压dp)
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP
[题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...
- bzoj1087互不侵犯King——状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1087 水题... 然而犯了两个致命小错误,调了好半天...详见注释. 代码如下: #incl ...
- 互不侵犯_状压$dp$
如果有想学习状压\(dp\)的童鞋,请光临博客状压\(dp\)初学 互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八 ...
- [SCOI2005]互不侵犯(状压DP)
嗝~算是状压DP的经典题了~ #\(\mathcal{\color{red}{Description}}\) 在\(N×N\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻 ...
随机推荐
- AngularJS学习笔记(一) 关于MVVM和双向绑定
写在前面: 因为需要开始学习ng,之前在知乎上听大神们介绍ng的时候说这个坑如何的大,学了一阵(其实也就三天),感觉ng做的很大很全,在合适的情境你可以完全使用ng搞定一切.这一点从诸如jqLite之 ...
- FFmpeg 'scale' filter not present, cannot convert pixel formats.
/*************************************************************************** * FFmpeg 'scale' filter ...
- 继续学习C:数字进制表示
1. 数字后面跟D表示十进制,如:123D. 2. 数字后面跟B表示二进制,如:10010B. 3. 数字后面跟Q表示八进制,如:652Q. 4. 数字后面跟H表示十六进制,如:2B5H. 把十进制数 ...
- Ffmpeg移植S3C2440
Ffmpeg移植过程: FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证.它的移植同样遵循LGPL或GPL移植方法:configure.make.make ...
- jitter buffer QoS的解决方案
本文主要介绍一种QoS的解决方案,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help QoS出现的背景: 而当网络发生拥塞的时候,所有的数据流都有 ...
- 20179203李鹏举 《Linux内核原理与分析》第一周学习笔记
Linux基础入门 一.Linux的基础学习 1.1 Linux的重要基础操作 Linux不同于Windows的纯粹的图形化界面,虽然也有图形桌面的操作但是更多的操作还是通过命令行来进行,当然除了命令 ...
- 2017-2018-1 20179215《Linux内核原理与分析》第三周作业
本次作业分为两部分:第一部分为实验.主要目的是进行基于MYKERNEL的一个简单的时间片轮转多道程序内核代码分析.第二部分为阅读教材,了解LINUX进程调度等. 一.实验部分 实验过程如过程所述:使用 ...
- 【Google】非下降数组
转自九章算法公众号 题目描述 给出包含n个整数的数组,你的任务是检查它是否可以通过修改至多一个元素变成非下降的.一个非下降的数组array对于所有的i(1<=i<n)满足array[i-1 ...
- windows下,CSV文件Excel打开乱码
在windows下面,csv文件另存为UTF-8,在excel中打开中文是乱码,如果另存为utf-8 Big + BOM,Excel打开则是正常显示
- Log Structured Merge Trees(LSM) 原理
http://www.open-open.com/lib/view/open1424916275249.html