【洛谷P1896【SCOI2005】】互不侵犯King

时间:2022-09-04 08:43:25

题目描述

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

输入输出格式

输入格式:

只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)

输出格式:

所得的方案数

输入输出样例

输入样例#1

3 2

输出样例#1

16

算法:

状压DP

 

分析:

这道题乍眼一看以为是搜索,其实不然,这道题实则是一道动规的题目。

虽然这道题目看上去和corn fields 求的东西不一样,CF那道题求的是方案数,这里求的是可行性的最大数,但是都是一堆的01串构成的(放与不放)。所以为了优化dp,这道题还是用状压dp。

 

同样的还是要初始化所有可行的状态和第一行的信息。这个很好理解,也不多说了。

 

但是这道题没这么简单,除了要记录上一维可行的状态之外,还要记录King的个数,将King也作为一个状态考虑。

 

上代码:

 

 #include<cstdio>
#include<iostream>
#define C continue
using namespace std; int n,k;
long long dp[][][],king[],state[],tot,ans;
//dp[i][j][k]表示第i行选j状态在这一行及之前摆上k个国王的方案总数,state是状态,King是那一行的国王总数 inline void init() //初始化
{
int i;
tot=(<<n)-;
for (i=;i<=tot;i++)
if (!((i<<)&i)) //满足提议(同行)
{
state[++ans]=i;
int t=i;
while (t) //记录国王个数
king[ans]+=t%,t>>=; //注意是右移一位
}
} int main()
{
int i,j,p,s;
scanf("%d%d",&n,&k);
init();
for (i=;i<=ans;i++) //初始化第一行
if (king[i]<=k)
dp[][i][king[i]]=;
for (i=;i<=n;i++) //枚举行
for (j=;j<=ans;j++) //枚举这行方案
for (p=;p<=ans;p++) //枚举上行方案
{
if (state[j]&state[p])
C;
if (state[j]&(state[p]<<))
C;
if ((state[j]<<)&state[p])
C;
for (s=;s<=k;s++) //枚举国王个数
{
if (king[j]+s>k)
C;
dp[i][j][king[j]+s]+=dp[i-][p][s];
}
}
tot=;
for (i=;i<=n;i++)
for (j=;j<=ans;j++)
tot+=dp[i][j][k];
printf("%lld",tot);
return ;
}

 

状压dp的题主要要考虑如何优化状态,主要都是用01串来解决,其他的内容和普通dp基本是一样的。

 

嗯,就这样了。

【洛谷P1896【SCOI2005】】互不侵犯King的更多相关文章

  1. 洛谷P1896 &lbrack;SCOI2005&rsqb;互不侵犯King

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

  2. 洛谷P1896 &lbrack;SCOI2005&rsqb;互不侵犯King【状压DP】

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

  3. 洛谷 P1896 &lbrack;SCOI2005&rsqb;互不侵犯King

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

  4. 洛谷 P1896 &lbrack;SCOI2005&rsqb;互不侵犯

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

  5. 洛谷——P1896 &lbrack;SCOI2005&rsqb;互不侵犯

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

  6. 【题解】洛谷P1896 &lbrack;SCOI2005&rsqb; 互不侵犯(状压DP)

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

  7. 洛谷 P1896 &lbrack;SCOI2005&rsqb;互不侵犯 (状态压缩DP)

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

  8. BZOJ1087&equals;Codevs2451&equals;洛谷P1896&amp&semi;P2326互不侵犯

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

  9. P1896 &lbrack;SCOI2005&rsqb;互不侵犯King

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

  10. 【洛谷P1896】互不侵犯

    题目大意:给定 N*N 的棋盘,一共放 K 个国王,一共有多少种方法. 题解: i&i<<1 判断是否每个 1 的位置之间都有 0. i&j<<1 判断 i 中 ...

随机推荐

  1. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  2. Atitit&period;事件机制 与 消息机制的联系与区别

    Atitit.事件机制 与 消息机制的联系与区别 1. 消息/事件机制是几乎所有开发语言都有的机制,在某些语言称之为消息(Event),有些地方称之为(Message).1 2. 发布/订阅模式1 3 ...

  3. DWZ &lpar;JUI&rpar; 教程 DWZ中dialog层的刷新

    在DWZ开发过程中经常会遇到的一种情况就是:在navTab页面中通过a标签打开一个dialog,在dialog层进行操作后,需要对该dialog层进行必要的刷新操作. 1.首先讲一下思路: 在非dia ...

  4. BZOJ 1030 文本生成器

    很老的题目了,很早以前学AC自动机的时候就A过一次 今天算是复习啦 我们可以把问题转化成一个给定字符串都没出现的字符串有多少个 我们建立AC自动机,设dp[i][j]表示走了i步当前在j节点上 在DP ...

  5. 【Java并发编程】并发编程大合集-值得收藏

    http://blog.csdn.net/ns_code/article/details/17539599这个博主的关于java并发编程系列很不错,值得收藏. 为了方便各位网友学习以及方便自己复习之用 ...

  6. 最小二乘法拟合java实现源程序(转)

    因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用./** * <p>函数功能:最小二乘法曲线拟合</p> * @ ...

  7. mysql 存在索引但不能使用索引的典型场景

    mysql 演示数据库:http://downloads.mysql.com/docs/sakila-db.zip 以%开头的LIKE查询不能够利用B-tree索引 explain select * ...

  8. Centos7安装GitLab

    GitLab CE Download Archives gitlab安装调试小记 Gitlab Free Trial GitLab搭建手记 Gitlab社区版的使用 GUI PNG Gitlab升级到 ...

  9. webform运行时弹出JavaScript的alert窗口

    https://*.com/questions/9720143/asp-net-web-application-message-box Or create a method l ...

  10. 提取配置文件中无注释的内容方法--findstr

    findstr /v /r # nginx.conf C:\Users\Liang>findstr /?在文件中寻找字符串. FINDSTR [/B] [/E] [/L] [/R] [/S] [ ...