题解【洛谷P1896】[SCOI2005]互不侵犯
棋盘类状压 DP 经典题。
我们考虑设 \(dp_{i,j,s}\) 表示前 \(i\) 行已经摆了 \(j\) 个国王,且第 \(i\) 行国王摆放的状态为 \(s\) 的合法方案数。
转移的时候枚举每一行的每种状态及已经摆放了的国王数量,然后枚举上一行的状态,如果合法就更新。
但是这样做的时间复杂度大致是 \(10 \times 10^2 \times 2^{10} \times 10^3 = 10^9\) 的,明显会 TLE,于是我们考虑如何优化。
其实我们在转移时有很多不合法的状态,即转移时的无用状态。于是我们考虑预处理一下所有在转移时合法的状态,这样优化后我们就可以 AC 本题了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 13, maxm = 1 << 11, maxk = 103;
int n, m, k;
int cnt[maxm]; //存储每个状态中 1 的个数
long long ans, dp[maxn][maxk][maxm];
vector <int> g; //存储合法的状态
vector <int> can[maxm]; //存储每个状态可以转移到的合法状态
//判断一个状态是否合法,即判断是否有连续的 2 个 1
inline bool check(int x)
{
for (int i = 0; i < n; i+=1)
if ((x >> i & 1) && (x >> (i + 1) & 1))
return false;
return true;
}
//求一个状态中 1 的个数
inline int get_1(int x)
{
int sum = 0;
for (int i = 0; i < n; i+=1)
if (x >> i & 1)
++sum;
return sum;
}
int main()
{
cin >> n >> m;
for (int i = 0; i < (1 << n); i+=1) //枚举所有状态
if (check(i)) //该状态合法
{
g.push_back(i);
cnt[i] = get_1(i);
}
int len = g.size(); //合法状态的个数
for (int i = 0; i < len; i+=1)
for (int j = 0; j < len; j+=1) //枚举每两个合法的状态
{
int a = g[i], b = g[j];
if (!(a & b) && check(a | b))
can[i].push_back(j); //两个状态在转移时可以放相邻两行
}
dp[0][0][0] = 1;
for (int i = 1; i <= n; i+=1) //枚举行数
for (int j = 0; j <= m; j+=1) //枚举国王个数
for (int k = 0; k < len; k+=1) //枚举状态
{
int len1 = can[k].size(), geshu_1 = cnt[g[k]];
for (int ll = 0; ll < len1; ll+=1) //枚举上一行的状态
{
int l = g[can[k][ll]];
if (j >= geshu_1) //可以进行转移
dp[i][j][g[k]] += dp[i - 1][j - geshu_1][l];
}
}
for (int i = 0; i < (1 << n); i+=1) //枚举最后一行的状态
ans += dp[n][m][i]; //统计答案
cout << ans << endl; //输出答案
return 0;
}
题解【洛谷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] 互不侵犯(状压DP)
洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...
- 洛谷 P1896 [SCOI2005]互不侵犯 (状态压缩DP)
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 注:数据有加强(2018/4/25) ...
- 洛谷 P1896 [SCOI2005]互不侵犯King
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入输出格式 输入格式: 只有一行,包 ...
- 洛谷P1896 [SCOI2005]互不侵犯King【状压DP】
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入格式: 只有一行,包含两个数N,K ...
- BZOJ1087=Codevs2451=洛谷P1896&P2326互不侵犯
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2885 Solved: 1693[Submit][ ...
- 【洛谷P1896】互不侵犯
题目大意:给定 N*N 的棋盘,一共放 K 个国王,一共有多少种方法. 题解: i&i<<1 判断是否每个 1 的位置之间都有 0. i&j<<1 判断 i 中 ...
- P1896 [SCOI2005] 互不侵犯 方法记录
原题链接 [SCOI2005] 互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
随机推荐
- Git简易教程(常用命令)
本文章参考了Pro Git 1 Git简介 Linux内核开源项目有着众多参与者,为了提高开发效率,项目组于2002年开始启用分布式版本控制系统BitKeeper来管理和维护代码.在BitKeeper ...
- Linux内存管理解析(二) : 关于Linux内存管理的大体框架
什么是内存管理 ? 首先内存管理管理的主要对象是虚拟内存,但是虚拟内存对应的映射主要为物理内存,其次也可能通过交换空间把虚拟内存与硬盘映射起来,既然如此,那我们先了解物理内存的管理. 对于物理内存而言 ...
- C# 根据天、周、月汇总统计生成统计报表
先看核心代码: public List<DataEntity> SearchShopSalesReport(DateTimeOffset? dateFrom, DateTimeOffset ...
- 异常 lock buffer failed for format 0x23
02-11 21:21:45.669625 14804 14815 W Monkey : // java.lang.RuntimeException: lock buffer failed for f ...
- Hadoop-HDFS(HDFS-HA)
HDFS(Hadoop Distributed File System) 分布式文件系统,HDFS是一个高度容错性的系统,适合部署在廉价的机器上.HDFS能提供高吞吐量的数据访问,非常适合大规模数据集 ...
- sublime中写python代码
SublimeREPL插件 这个是首先要安装的,此插件主要功能是为了实现交互,在安装后需要一些简单的配置 在Preferences--> Key Bindings--> user下添加如下 ...
- (未完成)【Android】MVP模式初见(一)
最近在阅读郭霖大神的公众号时,分类中架构引起了我的注意. 虽然是个人开发(水平很菜的那种),但最终都要向企业正式项目开发靠近.因此接下来一段时间,主要学习一下MVP架构.Retrofit以及RxJav ...
- C# WPF聊天界面(3/3)
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# WPF聊天界面(3/3) 阅读导航 本文背景 代码实现 本文参考 1.本文背景 系列文章 ...
- 【机器学习】使用CNN神经网络实现对图片分类识别及模型转换
仅做记录,后面慢慢整理 训练函数: from skimage import io, transform # skimage模块下的io transform(图像的形变与缩放)模块 import glo ...
- 吴裕雄--天生自然 R语言开发学习:集成开发环境\工具RStudio的安装与配置