前言:一道状压DP的入门题(可惜我是个DP蒟蒻QAQ)

------------------

题意简述:求在一个$n*n$的棋盘中放$k$个国王的方案数。注:当在一个格子中放入国王后,以此格为中心的九宫格的其他八个格子将不能放置国王。

数据范围:$1\leq n\leq 9$,$1\leq k\leq n*n$。

------------------------------

看到数据范围,不是$dfs$就是状压DP。这道题我们考虑状压DP。

状压DP就是把某个阶段转换成二进制记录下来,一般用于数据范围较小的题目,状压因此得名。

国王个数是一个限制条件,所以这是一个阶段。在状压DP中,我们一般考虑以行作为阶段。因为上一行的放置情况关系到这一行的放置情况,所以我们还要再用一维表示放置情况,这一维要用到状压。

所以我们设$f[i][j][k]$为在前$i$行中放入$k$个国王,且这一行的摆放情况为$j$的方案数。摆放情况可以用$dfs$预先处理。

考虑转移过程中的限制条件:

如果$ sit[j]$ 与 $sit[k]=1 $,则表示上下相邻的格子都摆放了国王。

如果$ (sit[j]<<1)$ 与 $sit[k]=1 $,则表示左上或右下摆放了国王。

如果$ sit[j]$ 与 $(sit[k]<<1)=1 $,则表示右上或左下的格子摆放了国王。

左右相邻的情况在$dfs$中即可排除。

转移方程:$f[i][j][s]+=f[i-1][k][s-num[j]]$。$num[j]$表示放置情况为$j$时国王的放置个数。

边界:$f[1][i][num[i]]=1$。

其实貌似可以用滚动数组优化来省掉第一维,但我懒得写了。

注意开$long long$。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,cnt=,ans=;
int sit[],num[];//预处理放置情况
int f[][][];
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
void dfs(int pos,int sum,int node)
{
if (node>=n)
{
sit[++cnt]=pos;
num[cnt]=sum;
return;
}
dfs(pos,sum,node+);//在此格不放入国王
dfs(pos+(<<node),sum+,node+);//在此格放入国王,此时要跳过相邻的格子。
}
signed main()
{
n=read(),m=read();
dfs(,,);
for (int i=;i<=cnt;i++) f[][i][num[i]]=;//边界
for (int i=;i<=n;i++)
for (int j=;j<=cnt;j++)
for (int k=;k<=cnt;k++)
{
if (sit[j]&sit[k]) continue;
if ((sit[j]<<)&sit[k]) continue;
if (sit[j]&(sit[k]<<)) continue;
for (int s=m;s>=num[j];s--) f[i][j][s]+=f[i-][k][s-num[j]];//转移
}
for (int i=;i<=cnt;i++) ans+=f[n][i][m];
printf("%ld",ans);
return ;
}

【SCOI2005】互不侵犯 题解(状压DP)的更多相关文章

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

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

  2. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  3. 【BZOJ1087】 [SCOI2005]互不侵犯King 状压DP

    经典状压DP. f[i][j][k]=sum(f[i-1][j-cnt[k]][k]); cnt[i]放置情况为i时的国王数量 前I行放置情况为k时国王数量为J #include <iostre ...

  4. [BZOJ1087] [SCOI2005] 互不侵犯King (状压dp)

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

  5. [SCOI2005]互不侵犯(状压DP)

    嗝~算是状压DP的经典题了~ #\(\mathcal{\color{red}{Description}}\) 在\(N×N\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻 ...

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

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

  7. BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP

    [题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...

  8. 互不侵犯king (状压dp)

    互不侵犯king (状压dp) 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.\(1\le n\ ...

  9. BZOJ-1087 互不侵犯King 状压DP+DFS预处理

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...

  10. bzoj1087 互不侵犯King 状压dp+bitset

    题目传送门 题目大意:中文题面. 思路:又是格子,n又只有9,所以肯定是状压dp,很明显上面一行的摆放位置会影响下一行,所以先预处理出怎样的二进制摆放法可以放在上下相邻的两行,这里推荐使用bitset ...

随机推荐

  1. 原生JS实现树状结构列表

    树状结构列表,这个技术点之前有写过了,是基于vue讲解,但似乎都没有解决痛点,最基础的原生JS该怎么实现呢? 这篇文章会全面详细的介绍树状结构列表的实现,从数据处理成树状结构,到动态生成dom节点渲染 ...

  2. Layui文本框限制正整数

    <input type="text" name="Number" lay-verify="required|integer" plac ...

  3. 【转】Hbuilder配置Avalon、Vue指令提示

    转载自CSDN http://blog.csdn.net/jianggujin/article/details/71419828 我本人是一名Java后端开发,偶尔也会研究一下前端内容,因为Hbuil ...

  4. 查看mysql所有命令

  5. Scala 面向对象(二):package 包 (一) 入门

    1 Scala包的基本介绍 和Java一样,Scala中管理项目可以使用包,但Scala中的包的功能更加强大,使用也相对复杂些,下面我们学习Scala包的使用和注意事项. 2 Scala包快速入门 使 ...

  6. Python Ethical Hacking - Malware Analysis(2)

    Filtering Command Output using Regex #!/usr/bin/env python import smtplib import subprocess import r ...

  7. P5198 [USACO19JAN]Icy Perimeter S (洛谷) (水搜索)

    同样是因为洛谷作业不会写…… 写(水)博客啦. 直接放题目吧,感觉放在代码框里好看点 Farmer John要开始他的冰激凌生意了!他制造了一台可以生产冰激凌球的机器,然而不幸的是形状不太规则,所以他 ...

  8. 使用PowerShell自动编译部署前端

    前言 最近在开发一套管理系统,做了前后端分离. 后台使用的是Asp.Net Core 3.1 前端使用的是Vue+Ant Design 自己搞了一台云服务器,打算把系统部署到云服务器上.以供外网访问. ...

  9. xenomai内核解析之信号signal(二)---xenomai信号处理机制

    xenomai信号 上篇文章讲了linux的信号在内核的发送与处理流程,现在加入了cobalt核,Cobalt内核为xenomai线程提供了信号机制.下面一一解析xenomai内核的信号处理机制. 1 ...

  10. 题解 CF 1372A

    题目 传送门 题意 构造一个长度为n的数组,对于数组中的元素a,b,c,满足\(a+b\neq c\). 思路 直接让数组中的数全部变成1就可以了(其他数也行). 代码 /* * Author :We ...