一道超级简单的状压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]互不侵犯的更多相关文章

  1. 洛谷 P1896 [SCOI2005]互不侵犯

    洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...

  2. 洛谷P1896 [SCOI2005]互不侵犯King

    P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...

  3. 洛谷——P1896 [SCOI2005]互不侵犯

    P1896 [SCOI2005]互不侵犯 状压DP入门题 状压DP一般需要与处理状态是否合法,节省时间 设定状态dp[i][j][k]表示第i行第j个状态选择国王数为k的方案数 $dp[i][j][n ...

  4. P1896 [SCOI2005] 互不侵犯 方法记录

    原题链接 [SCOI2005] 互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...

  5. 洛谷 P1896 [SCOI2005]互不侵犯 (状态压缩DP)

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 注:数据有加强(2018/4/25) ...

  6. 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)

    洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...

  7. 洛谷 P1896 [SCOI2005]互不侵犯King

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入输出格式 输入格式: 只有一行,包 ...

  8. P1896 [SCOI2005]互不侵犯King

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入输出格式 输入格式: 只有一行,包 ...

  9. 洛谷P1896 [SCOI2005]互不侵犯King【状压DP】

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入格式: 只有一行,包含两个数N,K ...

随机推荐

  1. 使用volley上传多张图片,一个参数对应多张图片,转载

    https://my.oschina.net/u/1177694/blog/491834 原帖地址 而如果使用volley的话,因为请求数据那些都很简便,但遇到上传文件就麻烦那可不好,同时使用多个网络 ...

  2. IDEA错误:Failed to start end point associated with ProtocolHandler [http-nio-9999] java.net.BindException: Address already in use: bind

    日志显示进程端口已被占用,首先需要的是查询什么进程占用了当前的9999端口. 1.win+R输入cmd进入命令界面: 2.输入命令  netstat -ano|findstr "端口号&qu ...

  3. Asp.Net Core 使用Quartz基于界面画接口管理做定时任务

    今天抽出一点点时间来造一个小轮子,是关于定时任务这块的. 这篇文章主要从一下几点介绍: 创建数据库管理表 创建web项目 引入quarzt nuget 包 写具体配置操作,实现定时任务处理 第一步:创 ...

  4. IO事件驱动模型

    1:IO事件驱动模型简介 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每 ...

  5. 第四周读书笔记——读《我是一只IT小小鸟》有感

             读<我是一只IT小小鸟>有感 这是邓老师倾力推荐的一本书.这本书的标题化用了我们耳熟能详的歌词,算是较有新意吧.更重点在于,这本书的作者不是哪一位大牛,而是一群刚刚走出校 ...

  6. Anaconda3 错误集合

    1. An error ocurred while starting the kernel 答:个人猜测有可能是配置文件出现问题,于是采用如下解决方法: 在终端中输入spyder --reset,重置 ...

  7. 洗礼灵魂,修炼python(24)--自定义函数(5)—匿名函数lambda

    在这个互联网时代,大家都喜欢匿名,匿名上网,匿名登录,匿名操作等等,都不喜欢实名对吧?(虽然说现在实名制已经快到来,题外话,扯远了),当然python里也有个不喜欢实名的,它的功效优点特殊,说强大吧? ...

  8. 【HANA系列】SAP HANA XS的JavaScript API详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS的Java ...

  9. zTree 优秀的jquery树插件

    zTree 优秀的jquery树插件,文档详细,渲染快 使用方法: 1.引用zTree的js和css文件 <link href="~/Content/zTree_v3/css/zTre ...

  10. PDO 对 mysql的基本操作

    PDO扩展操作 <?php $dsn = 'mysql:dbname=yii2;host=localhost'; $user = 'root'; $password = '123456'; tr ...