BZOJ 1087 互不侵犯
Description
在\(N \times N\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共\(8\)个格子。
Input
只有一行,包含两个数$N,K $。
Output
方案数。
Sample Input
3 2
Sample Output
16
HINT
$ 1 le N \le 9, 0 \le K \le N \times N$
一道很明显的状态压缩dp题。
题解就不谢了,直接上代码(代码复杂度有点虚,还是能过。有许多的地方可以优化)吧。
可以使用轮廓线(插头)dp来优化复杂度(lyp教我的)。
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef long long ll;
#define maxn (11)
int N,K; ll f[82][maxn][1<<maxn],g[82][maxn][1<<maxn];
inline int oc(int x)
{
x=(x&0x55555555UL)+((x>>1)&0x55555555UL); //1
x=(x&0x33333333UL)+((x>>2)&0x33333333UL); //2
x=(x&0x0f0f0f0fUL)+((x>>4)&0x0f0f0f0fUL); //3
x=(x&0x00ff00ffUL)+((x>>8)&0x00ff00ffUL); //4
x=(x&0x0000ffffUL)+((x>>16)&0x0000ffffUL);//5
return x;
}
inline bool okay(int x) { return !(x&(x>>1)); }
inline bool fit(int x,int y) { return !(x&y); }
int main()
{
freopen("1087.in","r",stdin);
freopen("1087.out","w",stdout);
scanf("%d %d",&N,&K);
g[0][1][0] = 1;
for (int i = 1;i <= N;++i)
{
for (int l = 0;l <= K;++l)
for (int j = 0;j < (1<<N);++j)
if (g[i][j])
for (int k = 0;k < (1<<N);++k)
if (l+oc(k) <= K && okay(k) && fit(j,k))
f[l+oc(k)][i][k] += g[l][i][j];
for (int l = 0;l <= K;++l)
for (int j = 0;j < (1<<N);++j)
{
if (!f[l][i][j]) continue;
int p = 0;
for (int k = 0;k < N;++k)
if (j & (1<<k))
{
p |= 1<<k;
if (k) p|=1<<(k-1);
if (k < N-1) p |= 1<<(k+1);
}
g[l][i+1][p] += f[l][i][j];
}
}
ll ans = 0;
for (int i = 0;i < (1<<N);++i) ans += f[K][N][i];
printf("%lld",ans);
fclose(stdin); fclose(stdout);
return 0;
}
BZOJ 1087 互不侵犯的更多相关文章
- BZOJ 1087 互不侵犯king
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- BZOJ 1087 互不侵犯King 状态压缩DP
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1087 题目大意; 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国 ...
- BZOJ 1087 互不侵犯King (位运算)
题解:首先,这道题可以用位运算来表示每一行的状态,同八皇后的搜索方法,然后对于限制条件不相互攻击,则只需将新加入的一行左右移动与上一行相&,若是0则互不攻击,方案可行.对于每种方案,则用递推来 ...
- 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 ...
- 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 我写的太水了……64ms才过,估计还有更好的做法,希望各位神犇不吝赐教>_<. 嗯这题很明显每一行都可以用一个2进制数表示放置方式的,(1表示放,0表示不放).然后预处理一下所有 ...
- BZOJ 1087:[SCOI2005]互不侵犯King(状压DP)
[SCOI2005]互不侵犯King [题目描述] 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
- 1087: [SCOI2005]互不侵犯King
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4276 Solved: 2471[Submit][ ...
随机推荐
- C. Tourist Problem
http://codeforces.com/problemset/problem/340/C 赛时没想出赛后却能较快想出深深的教育自己做题一定要静下心来,不要轻易放弃,认真思考,不要浮躁着急,不要太容 ...
- Android获得线性渐变某点的颜色
安卓官方确实提供了好多非常强大的工具给我们了,例如我们最近经常在shape中加入gradient(渐变),像我的项目中用的是线性渐变, <?xml version="1.0" ...
- iOS--iOS7摄像头识别二维码功能
iOS–iOS7摄像头识别二维码功能 属性介绍: AVFoundation 框架基于以下几个类实现图像捕捉 ,通过这些类可以访问来自相机设备的原始数据并控制它的组件. AVCaptureDevice ...
- 详细分享UICollectionView的自定义布局(瀑布流, 线性, 圆形…)
前言: 本篇文章不是分享collectionView的详细使用教程, 而是属于比较’高级’的collectionView使用技巧, 阅读之前, 我想你已经很熟悉collectionView的基本使用, ...
- 关于this 的一个问题
var name = "the window"; var object = { name:"my object"; getName:function(){ re ...
- 版本控制-cvs
我们实训用的是cvs. 团队协作: 代码版本控制软件:CVS.SVN.GIT(Git@开源中国) FTP:服务端.客户端 CVS: 服务端(源码仓库).客户端
- oracle中获取特定时间的前一天
select to_char(to_date('@rq','YYYY-MM-DD')-1,'YYYY-MM-DD') FROM DUAL 把@rq换成你要的时间就行了
- linux常用命令之ln
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...
- 最简单的基于FFmpeg的移动端例子:IOS 推流器
转至:http://blog.csdn.net/leixiaohua1020/article/details/47072519 ================================== ...
- iPhone中如何判断当前相机是否可用
UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; if (![UIImag ...