Luogu P1896 [SCOI2005]互不侵犯
一道超级简单的状压DP题所以说状压是个好东西
看数据范围,同时我们发现一个格子要么放国王or不放,因此可以用二进制数来表示某一行的国王放置信息
于是我们马上想到用\(f_{i,j}\)表示放了前\(i\)行,其中第\(i\)行的国王摆放情况为\(j\)时的方案数
那么转移就很显然了,每次我们枚举本行的国王信息以及上一行的放置位置,然后判断是否合法即可。
具体的操作其实就是\(<<,>>\)之后\(\&\)一下即可,这个自己看
那么这样时限可能有点紧,我们还可以预处理一下每一行的合法情况,然后每次只枚举这些合法情况
当然还有些dalao说可以两行一起处理,这样会更快
反正我这么菜肯定不会,其他的看CODE吧
// luogu-judger-enable-o2
#include<cstdio>
using namespace std;
const int N=10;
long long f[N][(1<<N)+5][N*N],ans;
int n,m,tot,t[(1<<N)+5];
bool c[(1<<N)+5];
inline bool check(int x)
{
int flag=0;
while (x)
{
if ((x&1)&flag) return 0;
flag=x&1; x>>=1;
} return 1;
}
inline int calc(int x)
{
int res=0; while (x) res+=x&1,x>>=1; return res;
}
inline bool judge(int x,int y)
{
return !(x&y||x&(y<<1)||(x<<1)&y);
}
int main()
{
scanf("%d%d",&n,&m); register int i,j,k,s; tot=(1<<n)-1;
for (i=0;i<=tot;++i)
c[i]=check(i),t[i]=calc(i);
for (i=0;i<=tot;++i)
if (c[i]) f[1][i][t[i]]=1;
for (i=2;i<=n;++i)
for (j=0;j<=tot;++j)
if (c[j]) for (k=0;k<=tot;++k)
if (c[k]&&judge(j,k))
for (s=m;s>=t[j];--s) f[i][j][s]+=f[i-1][k][s-t[j]];
for (i=0;i<=tot;++i)
ans+=f[n][i][m];
return printf("%lld",ans),0;
}
Luogu P1896 [SCOI2005]互不侵犯的更多相关文章
- 洛谷 P1896 [SCOI2005]互不侵犯
洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...
- 洛谷P1896 [SCOI2005]互不侵犯King
P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...
- 洛谷——P1896 [SCOI2005]互不侵犯
P1896 [SCOI2005]互不侵犯 状压DP入门题 状压DP一般需要与处理状态是否合法,节省时间 设定状态dp[i][j][k]表示第i行第j个状态选择国王数为k的方案数 $dp[i][j][n ...
- P1896 [SCOI2005] 互不侵犯 方法记录
原题链接 [SCOI2005] 互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
- 洛谷 P1896 [SCOI2005]互不侵犯 (状态压缩DP)
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 注:数据有加强(2018/4/25) ...
- 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)
洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...
- 洛谷 P1896 [SCOI2005]互不侵犯King
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入输出格式 输入格式: 只有一行,包 ...
- P1896 [SCOI2005]互不侵犯King
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入输出格式 输入格式: 只有一行,包 ...
- 洛谷P1896 [SCOI2005]互不侵犯King【状压DP】
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入格式: 只有一行,包含两个数N,K ...
随机推荐
- sqlserver序列定时初始化
1.创建序列 2.序列初始化存储过程 create procedure proDemo as begin alter sequence dbo.序列名 restart with 0; end 3.创建 ...
- go xorm增删改查
1.增加 如果传入的bean不是完整的bean,并且传入了地址,则调用结束后会被赋值// InsertOne insert only one struct into database as a rec ...
- 【PAT】B1068 万绿丛中一点红(20 分)
一开始因为看见这题就头疼,可费了点时间. 要考虑所有元素,如果忽略外圈元素,最后一个样例过不去. 而且要求只出现一次的元素, 我没有使用map,因为当时还没学,用map储存元素会节约好多代码 #inc ...
- ccf-20170303--Markdown
我的想法如下图: 代码和题目如下: 问题描述 试题编号: 201703-3 试题名称: Markdown 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 Markdown 是一 ...
- MySQL基本简单操作03
MySQL基本简单操作 现在我创建了一个数据表,表的内容如下: mysql> select * from gubeiqing_table; +----------+-----+ | name | ...
- JS的局部变量和全局变量
两段JS代码的区别: <script type="text/javascript"> var a = "Hello"; function test( ...
- 【知识碎片】Mysql语句
(1)mysql 更新最新的一条记录 ;
- Ros使用Arduino 1安装Arduino IDE
安装Arsuino IDE sudo apt-get install arduino 设置库文件路径 在使用ROS的库文件时,必须在代码的开头包括: #include <ros.h> 接下 ...
- linux 的常用命令---------第十一阶段
软件管理rpm.yum 在 windows 与 linux 之间 实现小文件传输(仅支持在 X shell 中完成文件传输,虚拟机中不可实现): # yum install lrzsz -y ...
- python3 day03 大纲
一. 上次课内容回顾 1. 格式化输出 %d 占位数字 %s 占位字符串 %f 占位小数 "jfklasjkfj%s %d %f" % (值1, 值2, 值3) "{}爱 ...