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][ ... 
随机推荐
- ERP大作业进度(一)
			ERP和进销存的区别 ERP(企业资源计划)和进销存(进货.销售和库存管理)是两个不同的概念,尽管它们在企业管理中通常存在交集.以下是它们之间的主要区别: 范围: ERP:ERP系统是一个综合性的.集 ... 
- C++ 共享内存ShellCode跨进程传输
			在计算机安全领域,ShellCode是一段用于利用系统漏洞或执行特定任务的机器码.为了增加攻击的难度,研究人员经常探索新的传递ShellCode的方式.本文介绍了一种使用共享内存的方法,通过该方法,两 ... 
- MySQL 分组排序后 → 如何取前N条或倒数N条
			开心一刻 晚上,老婆辅导女儿写语文作业 填空题:春天来了,__绿了 女儿:春天来了,爸爸绿了 老婆一脸不悦地问道:你再说一遍,春天来了,什么玩意绿了? 女儿:春天来了,爸爸绿了呀 老婆很生气,但依旧温 ... 
- [CF1748E] Yet Another Array Counting Problem
			题目描述 The position of the leftmost maximum on the segment $ [l; r] $ of array $ x = [x_1, x_2, \ldots ... 
- pytorch学习笔记——加载checkpoint时,程序报错,存在GPU和CPU不同步的情况
			当我们需要加载之前训练的checkpoint的时候,有时候会发现之前能训练的代码无法继续训练. 这时候很有可能加载优化器的步骤在加载模型前面,这样可能会导致优化器的参数仍然在CPU上,因此代码需要由原 ... 
- Javascript Ajax总结——跨域资源共享
			XHR对象只能访问与包含它的页面位于同一个中的资源.这种安全策略可以预防某些恶意行为.CORS(Cross-Origin Resource Sharing,跨域资源共享)是W3C的一个工作草案,定义了 ... 
- Python——第一章:注释、变量、常量
			python中的注释有2种: 1.单行注释 单行注释用# #这是一个单行注释 快捷键用Ctrl+/全选多个内容可以多行快速注释,也可以快速去掉注释符# 比如快速将全选的所有行注释掉--加# 2.多行注 ... 
- 安装Zabbix客户端zabbix-agent2
			Ubuntu系统:下载链接:http://mirrors.aliyun.com/zabbix/zabbix/6.0/ubuntu/pool/main/z/zabbix/?spm=a2c6h.25603 ... 
- 神经网络优化篇:详解Mini-batch 梯度下降(Mini-batch gradient descent)
			Mini-batch 梯度下降 机器学习的应用是一个高度依赖经验的过程,伴随着大量迭代的过程,需要训练诸多模型,才能找到合适的那一个,所以,优化算法能够帮助快速训练模型. 其中一个难点在于,深度学习没 ... 
- 3种依赖管理工具实现requirements.txt文件生成
			1.pip 实现方式 要使用 pip 生成 requirements.txt 文件,可以使用以下命令: pip freeze > requirements.txt 这个命令会将当前环境中 ... 
