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 ...
随机推荐
- loadrunner 运行脚本-Run-time Settings之Pacing设置
运行脚本-Run-time Settings之Pacing设置 by:授客 QQ:1033553122 As soon as the previous iteration ends 前一个迭代一结 ...
- Oracle 11gR2_database在Linux下的安装
Oracle 11gR2_database在Linux下的安装 by:授客 QQ:1033553122 由于篇幅问题,采用链接分享的形式,烦请复制以下网址,黏贴到浏览器中打开,下载 http://pa ...
- OneAPM大讲堂 | Metrics, Tracing 和 Logging 的关系
[编者按]这是在 OpenTracing 和分布式追踪领域内广受欢迎的一片博客文章.在构建监控系统时,大家往往在这几个名词和方式之间纠结. 通过这篇文章,作者很好的阐述了分布式追踪.统计指标与日志之间 ...
- Python鸢尾花分类实现
#coding:utf-8 from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_s ...
- 洗礼灵魂,修炼python(46)--巩固篇—如虎添翼的property
@property 在前面装饰器一章中,提过一句话,装饰器也可以用于类中,确实可以的,并且python的类也内置了一部分装饰器.并且在前两章的hasattr等四个内置方法中,也说过其用法很类似装饰器, ...
- JDBC数据类型、Java数据类型、标准sql类型
本概述是从<JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference>这本书中摘引来的.JavaSoft ...
- 数据库_存储过程简介(oracle版)
应朋友要求,写个存储过程说明,本篇比较简单,适合新接触存储过程的同学 先来个简单的 begin dbms_output.put_line('my first execute'); end; 如果使用的 ...
- MySQL内连接(INNER JOIN)
MySQL INNER JOIN子句介绍 MySQL INNER JOIN子句将一个表中的行与其他表中的行进行匹配,并允许从两个表中查询包含列的行记录. INNER JOIN子句是SELECT语句的可 ...
- January 10th, 2018 Week 02nd Wednesday
No need to have a reason to love you. Anything can be a reason not to love you. 喜欢你,不需要什么理由:不喜欢你,什么都 ...
- vue实例详解
Vue实例的构造函数 每个 Vue.js 应用都是通过构造函数 Vue 创建一个 Vue 的根实例 启动的 虽然没有完全遵循 MVVM 模式, Vue 的设计无疑受到了它的启发.因此在文档中经常会使用 ...