SCOI2005 互不侵犯 (状态压缩入门题)
使用状态压缩,最好了解 位运算使用
在 \(N\times N\) 的棋盘里面放 \(K\) 个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 \(8\) 个格子。
我们用 \(f(i,j,l)\) 表示前 \(i\) 行,当前状态为 \(j\) ,且已经放置 \(l\) 个国王时的方案数。
其中 \(j\) 这一维状态我们用一个二进制整数表示( \(j\) 的某个二进制位为 0 代表对应的列不放国王,否则代表对应的列放国王)。
我们需要在刚开始的时候预处理出一行的所有合法状态 \(sta(x)\) (排除同一行内两个国王相邻的不合法情况),在转移的时候枚举这些可能状态进行转移。
设当前行的状态为 \(j\) ,上一行的状态为 \(x\) ,可以得到下面的转移方程: \(f(i,j,l) = \sum f(i-1,x,l-sta(x))\) 。
需要注意在转移时排除相邻两行国王互相攻击的不合法情况。
#include <algorithm>
#include <iostream>
using namespace std;
long long sta[2005], sit[2005], f[15][2005][105];
int n, k, cnt;
void dfs(int x, int num, int cur) {
if (cur >= n) { // 有新的合法状态
sit[++cnt] = x;
sta[cnt] = num;
return;
}
dfs(x, num, cur + 1); // cur位置不放国王
dfs(x + (1 << cur), num + 1,
cur + 2); // cur位置放国王,与它相邻的位置不能再放国王
}
int main() {
cin >> n >> k;
dfs(0, 0, 0); // 先预处理一行的所有合法状态
for (int i = 1; i <= cnt; i++) f[1][i][sta[i]] = 1;
for (int i = 2; i <= n; i++)
for (int j = 1; j <= cnt; j++)
for (int l = 1; l <= cnt; l++) {
if (sit[j] & sit[l]) continue;
if ((sit[j] << 1) & sit[l]) continue;
if (sit[j] & (sit[l] << 1)) continue;
// 排除不合法转移
for (int p = sta[j]; p <= k; p++) f[i][j][p] += f[i - 1][l][p - sta[j]];
}
long long ans = 0;
for (int i = 1; i <= cnt; i++) ans += f[n][i][k]; // 累加答案
cout << ans << endl;
return 0;
}
几道练习题
SCOI2005 互不侵犯 (状态压缩入门题)的更多相关文章
- bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Descripti ...
- 洛谷1377 M国王 (SCOI2005互不侵犯King)
洛谷1377 M国王 (SCOI2005互不侵犯King) 本题地址:http://www.luogu.org/problem/show?pid=1377 题目描述 天天都是n皇后,多么无聊啊.我们来 ...
- 洛谷——P1896 [SCOI2005]互不侵犯
P1896 [SCOI2005]互不侵犯 状压DP入门题 状压DP一般需要与处理状态是否合法,节省时间 设定状态dp[i][j][k]表示第i行第j个状态选择国王数为k的方案数 $dp[i][j][n ...
- P1896 [SCOI2005] 互不侵犯 方法记录
原题链接 [SCOI2005] 互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- SCOI2005互不侵犯King
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1499 Solved: 872[Submit][S ...
- 1087: [SCOI2005]互不侵犯King
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4276 Solved: 2471[Submit][ ...
- BZOJ1087 SCOI2005 互不侵犯King 【状压DP】
BZOJ1087 SCOI2005 互不侵犯King Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附 ...
- 洛谷P1896 [SCOI2005]互不侵犯King
P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...
- [Bzoj1083][SCOI2005]互不侵犯king(状压dp)
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4595 Solved: 2664[Submit][ ...
随机推荐
- 【Android】如何去掉默认标题栏
1.在AndroidManifest.xml文件中修改并添加以下代码 android:theme="@style/Theme.AppCompat.NoActionBar" 2.在你 ...
- 用EXCEL VBA 做的学生成绩分析系统
标题:基于EXCEL VBA的学生成绩分析系统--详细介绍与说明导言:学生成绩分析对于教育机构和学生个体来说具有重要意义.本文将详细介绍基于EXCEL VBA的学生成绩分析系统的设计与实现.通过该系统 ...
- 吉特日化MES & Redis 运行远程访问的配置
在吉特日化MES系统部署实施过程中,经常需要配置Redis需要运行远程IP访问Redis.使用Redis的目的主要是为了解决缓存的问题,同时解决打印过程中推送数据的问题. 一. Redis 的安装目录 ...
- 最好用的AI换脸软件,rope下载介绍
随着AI技术的广泛运用,市面上的换脸软件也多了起来,今天给各位介绍其中的王者Rope! 先上两个动图,给大伙看看效果 rope是如何实现这种自然的效果呢?这得益于机器学习技术的不断发展,rope经过深 ...
- ElasticSearch查询数据、全文检索、补全提示、拼写纠错
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search.html https://www.elastic.co/guide ...
- Chrome扩展程序是如何进行消息传递的
大家好,我是 dom 哥.这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星. 一个复杂的 Chrome 扩展程序通常由 content_scripts,background,ac ...
- 从零玩转设计模式之原型模式-yuanxingmoshi
title: 从零玩转设计模式之原型模式 date: 2022-12-11 20:05:35.488 updated: 2022-12-23 15:35:44.159 url: https://www ...
- 安装Zabbix客户端zabbix-agent2
Ubuntu系统:下载链接:http://mirrors.aliyun.com/zabbix/zabbix/6.0/ubuntu/pool/main/z/zabbix/?spm=a2c6h.25603 ...
- SQL优化案例(2):OR条件优化
接下来上一篇文章< SQL优化案例(1):隐式转换>的介绍,此处内容围绕OR的优化展开. 在MySQL中,同样的查询条件,如果变换OR在SQL语句中的位置,那么查询的结果也会有差异,在多个 ...
- Pikachu漏洞靶场 XXE(xml外部实体注入漏洞)
XXE(xml外部实体注入漏洞) 概述 XXE -"xml external entity injection" 既"xml外部实体注入漏洞". 概括一下就是& ...