当前位置: 首页 > news >正文

P1896[SCOI2005]互不侵犯 解题笔记

由于答案可能会很大,不难想到使用状压dp解决。

考虑使用二进制来表示:

\[100010_{(2)} = 34_{(10)} \]

这种访问方式比数组寻址更加简单快速,如 \((1 << (k - 1)) \& s\) 可以询问状态 \(s\) 的第 \(k\) 位上是 \(1\) 还是 \(0\)\((j >> k) << k\) 可以把状态 \(j\) 的二进制表示下最右边几位清零,而数组不可以 \(O(1)\) 的时间复杂度清零。

考虑使用 \(f_{i, j, k}\) 表示前 \(i\) 行,第 \(i\) 行状态的二进制表示(十进制下的值)为 \(j\) ,放置了 \(k\) 个国王的方案数,那么状态转移方程:

\(f_{i, j, k} = \sum f_{i - 1, new, k - getlen(j)}\)

其中 \(new\) 表示所枚举的上一行的所有合法状态,\(getlen(j)\) 表示 \(j\) 状态有多少位为 \(1\)

code:

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int dp[20][205][1100], ans, n, K, m, nn, L;
int _get(int x) {int sum = 0;while(x) {if(x & 1) sum ++;x >>= 1;}return sum;
}
bool check(int x, int y) {if(x & y) return 1;if((x << 1) & y) return 1;if((x >> 1) & y) return 1;if((y >> 1) & y) return 1;return 0;
}
signed main() {cin >> n >> K;dp[0][0][0] = 1;nn = (1 << n) - 1;for(int i = 1;i <= n;i ++) {for(int j = 0;j <= K;j ++) {for(int k = 0;k <= nn;k ++) {L = _get(k);if(L > j) continue;if(k & (k >> 1)) continue;for(int l = 0;l <= nn;l ++) {if(check(k, l)) continue;dp[i][j][k] += dp[i - 1][j - L][l];}}}}for(int i = 0;i <= nn;i ++) {ans += dp[n][K][i];} cout << ans;
} 
http://www.jsqmd.com/news/16871/

相关文章:

  • habse
  • P2214 [USACO14MAR] Mooo Moo S 解题笔记
  • P1854 花店橱窗布置 解题笔记
  • 什么是 DAQ
  • 央企程序员AI创业一个月感受 ✨
  • 微信小程序 在云函数本地调试时,总是提示node modules 未安装,立即安装。解决方法
  • 完整教程:C#开源项目:如何让100个贡献者比1个维护者更高效?
  • 使用PySide6/PyQt6实现自定义窗口布局,实现类似FluentWindow效果
  • 读书日记1
  • 对拍教程(自用)
  • 物理AI:智能自动化的下一个前沿
  • Write To Spreadsheet labview这是什么
  • 2025/10/19
  • tryhackme-预安全-网络基础知识-局域网介绍-05
  • 从众多知识汲取一星半点也能受益匪浅【day16(2025.10.18)】(加班但只加到四点半)
  • (个人思考)游戏技能的实现
  • 模拟赛T4 分析
  • UUT = Unit Under Test
  • ubuntu系统中containerd的cni网络配置
  • 十月阅读笔记
  • #20232408 2025-2026-1 《网络与系统攻防技术》实验二实验报告 - 20232408
  • 关于我的博客密码
  • UML图与数据流图
  • 题解:P2672 [NOIP 2015 普及组] 推销员
  • 如何选择合适的SAP实施公司?3步锁定靠谱的SAP服务商
  • 论DCT和IDCT的重要性,汇编SIMD版第一,此贴第二,就是这么狂 :-)
  • 这些SAP实施公司哪家强?国内比较好的SAP实施商推荐
  • 25秋周总结5
  • 博士研究文档管理技术指南
  • 10/19