当前位置: 首页 > 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.hskmm.com/?act=detail&tid=34496

相关文章:

  • habse
  • hbase
  • 微信小程序 在云函数本地调试时,总是提示node modules 未安装,立即安装。解决方法
  • Godot-C#场景之间的切换
  • 读书日记1
  • 【ARM CoreLink 系列 3.1 -- CCI-500 详细介绍 -上半部】
  • 央企程序员AI创业一个月感受 ✨
  • tryhackme-预安全-网络基础知识-局域网介绍-05
  • 10.19
  • 从众多知识汲取一星半点也能受益匪浅【day16(2025.10.18)】(加班但只加到四点半)
  • (个人思考)游戏技能的实现
  • 模拟赛T4 分析
  • ubuntu系统中containerd的cni网络配置
  • 十月阅读笔记
  • #20232408 2025-2026-1 《网络与系统攻防技术》实验二实验报告 - 20232408
  • 题解:P2672 [NOIP 2015 普及组] 推销员
  • 一文读懂Schnorr签名
  • 如何选择合适的SAP实施公司?3步锁定靠谱的SAP服务商
  • CSP-S2024
  • 10/19
  • 论DCT和IDCT的重要性,汇编SIMD版第一,此贴第二,就是这么狂 :-)
  • 这些SAP实施公司哪家强?国内比较好的SAP实施商推荐
  • 25秋周总结5
  • UML图
  • 博士研究文档管理技术指南
  • 题解:P12128 [蓝桥杯 2024 省 B 第二场] 质数变革
  • 题解:P12003 在小小的奶龙山里面挖呀挖呀挖(加强版)
  • apisix升级完整流程
  • 10.11-10.18 一周总结
  • 10/19/2025 一周总结