[SCOI2005]互不侵犯King
题目描述
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。
——by洛谷
https://www.luogu.org/problem/show?pid=1896
显然的棋盘模型的状压DP,故考虑对每行二进制状压,状压为表示有无王的01串,再由题意得到如下的限制:
- 每个串中不存在连续两个以上的1
- 相邻两串的同列不存在同为1的情况
- 不存在与上一行左侧或右侧同为1的情况
于是对于限制一,可在预处理中实现;对于二三,可在转移时限制,得出状态转移方程:
f[i][j][l+c[j]]=Σf[i-1][k][l];(i:当前行数;j:枚举本行所有可能状态,l+c[j]:此时的王的个数,c[j]:状态s[j]中王的个数)
然后对k进行限制,s[j]&s[k]==0,s[j]&(s[k]<<1)==0,s[j]&s[k]>>1)==0;之类的
需要注意的是:
- dfs预处理
- 处理好c[j]
总结:简单的DP么
代码如下:
#include<cstdio>
using namespace std;
long long f[][][];
int s[],c[];
int man;
int n,m;
void dfs(int ,int ,int ,int );
int main()
{
int i,j,k,l;
long long ans=;
scanf("%d%d",&n,&m);
dfs(,,,);
f[][][]=;
for(i=;i<=n;i++)
for(j=;j<=man;j++)
for(k=;k<=man;k++)
if((s[j]&s[k])==&&(s[j]&(s[k]<<))==&&(s[j]&(s[k]>>))==)
for(l=c[k];l<=m-c[j];l++)
f[i][j][l+c[j]]+=f[i-][k][l];
for(i=;i<=man;i++)
ans+=f[n][i][m];
printf("%lld",ans);
return ;
} void dfs(int now,int num,int ma,int p)
{
int i;
if(ma>m)return;
if(now==n+)
{
s[++man]=num;
c[man]=ma;
return;
}
for(i=;i<=;i++)
if(-p>=i)
dfs(now+,num+i*(<<(now-)),ma+i,i);
}
祝AC哟;
[SCOI2005]互不侵犯King的更多相关文章
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- SCOI2005互不侵犯King
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1499 Solved: 872[Submit][S ...
- 洛谷1377 M国王 (SCOI2005互不侵犯King)
洛谷1377 M国王 (SCOI2005互不侵犯King) 本题地址:http://www.luogu.org/problem/show?pid=1377 题目描述 天天都是n皇后,多么无聊啊.我们来 ...
- 1087: [SCOI2005]互不侵犯King
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4276 Solved: 2471[Submit][ ...
- BZOJ1087 SCOI2005 互不侵犯King 【状压DP】
BZOJ1087 SCOI2005 互不侵犯King Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附 ...
- bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Descripti ...
- 洛谷P1896 [SCOI2005]互不侵犯King
P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...
- BZOJ 1087:[SCOI2005]互不侵犯King(状压DP)
[SCOI2005]互不侵犯King [题目描述] 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
- [Bzoj1083][SCOI2005]互不侵犯king(状压dp)
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4595 Solved: 2664[Submit][ ...
- [bzoj1087][scoi2005]互不侵犯king
题目大意 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. 思路 首先,搜索可以放弃,因为这是一 ...
随机推荐
- Python的库和资源(转)
Python的库和资源: http://blog.sina.com.cn/s/blog_3cb6a78c0100hpaq.html Python 常用模块: http://www.pythonclub ...
- C++编写操作系统(1):基于 EFI 的 Bootloader
很久以前就对操作系统很好奇,用了这么多年Windows,对他的运作机理也不是很清楚,所以一直想自己动手写一个,研究一下操作系统究竟是怎么实现的.后来在网上也找到过一些教程(比如:<自己动手写操作 ...
- JavaScript中===与==的区别
参考网址:http://zhidao.baidu.com/link?url=RbWnRUHKPBTakwm2-iRfEDicrh4ZSAAeVfq2WvBkvfeLPkU-ZSqZ4chV8LWkCk ...
- VS2010 代码自动对齐 快捷键
VS2010 代码自动对齐 快捷键 先全选代码 ctrl+K+F MATLAB代码自动对齐 快捷键 先全选代码 ctrl+I
- BZOJ 2442: [Usaco2011 Open]修剪草坪
Description 在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠.然而,FJ的草坪非常脏乱,因此,FJ只能够让他的 ...
- HDU 5008 Boring String Problem
题意:给定一个串长度<=1e5,将其所有的不同的字串按照字典序排序,然后q个询问,每次询问字典序第k小的的起始坐标,并且起始坐标尽量小. 分析: 一开始看错题意,没有意识到是求不同的字串中第k小 ...
- cyg_flag 系列函数
http://blog.csdn.net/mrwangwang/article/details/7954236 cyg_flag_init Name: cyg_flag_init ( ) - init ...
- javascript小游戏--生命游戏
昨天参加Code Retreat的活动,"Code Retreat是一个一天的集中练习的活动,专注于软件开发和设计的基础". 要了解更多信息可前往 CodeRetreat官网 通过 ...
- dubbo spring2.5.6与spring 3冲突解决
dubbo的详细资料请参考: http://alibaba.github.io/dubbo-doc-static/Administrator+Guide-zh.htm#AdministratorGui ...
- 【HDOJ】1225 Football Score
这种结构体排序的题,十分容易考上机题,qsort+结构体解决.马上就要机考了,多练习一下这样的题目也好. #include <stdio.h> #include <string.h& ...