BZOJ 1087 [SCOI2005]互不侵犯King(状压DP)
题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上
左下右上右下八个方向上附近的各一个格子,共8个格子。n<=9
思路:状压dp,dp[i][j][k]为前i行放了j个,第i行状态为k
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<stack> #include<queue> #include<deque> #include<set> #include<vector> #include<map> #include<functional>#define fst first #define sc second #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) #define lson l,mid,root<<1 #define rson mid+1,r,root<<1|1 #define lc root<<1 #define rc root<<1|1 #define lowbit(x) ((x)&(-x)) using namespace std;typedef double db; typedef long double ldb; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> PI; typedef pair<ll,ll> PLL;const db eps = 1e-6; const int mod = 998244353; const int maxn = 2e6+100; const int maxm = 2e6+100; const int inf = 0x3f3f3f3f; const db pi = acos(-1.0);ll dp[20][200][2000]; int n, k; int num[2000]; int ys[2000];int main(){mem(dp, 0);mem(ys, 0);scanf("%d %d", &n, &k);for(int i = 0; i < (1<<n); i++){int p = i;int cnt = 0;while(p){if(p&1)cnt++;p>>=1;}num[i]=cnt;}for(int i = 0; i < (1<<n); i++){if(((i<<1)&i) ||((i>>1)&i)){continue;}ys[i] = 1;dp[1][num[i]][i]=1;}for(int i = 2; i <= n; i++){for(int j = 0; j <= k; j++){for(int p = 0; p < (1<<n); p++){//nowif(!ys[p])continue;if(num[p]>j)continue;for(int x = 0; x < (1<<n); x++){//last status from i-1if(!ys[x])continue;if((p&x)||((p<<1)&x)||(p>>1)&x)continue;dp[i][j][p] += dp[i-1][j-num[p]][x];}}}}ll ans = 0;for(int i = 0; i < (1<<n); i++){ans += dp[n][k][i];}printf("%lld", ans);return 0;}
转载于:https://www.cnblogs.com/wrjlinkkkkkk/p/9832606.html
BZOJ 1087 [SCOI2005]互不侵犯King(状压DP)相关推荐
- BZOJ 1087 SCOI2005 互不侵犯King 状压DP
题目大意:给定n*n的国际象棋棋盘.在上面放k个国王,要求国王之间互不攻击.求方案数 n<=⑨ 状压DP.将每一行的方案二进制压成一维,令f[i][j][k]为第i行用去j个国王状态为k的方案数 ...
- BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP
[题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...
- BZOJ 1087: [SCOI2005]互不侵犯King
二次联通门 : BZOJ 1087: [SCOI2005]互不侵犯King /*BZOJ 1087: [SCOI2005]互不侵犯King状压dp将每一行棋子的存在状态压成一个整数f[i][j][k] ...
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...
- 洛谷P1896 互不侵犯【状压DP】
题目链接:P1896 互不侵犯 分析:普通的状压DP再多加一维记个数,然后找到能转移到当前的状态更新答案: #include<bits/stdc++.h> using namespace ...
- 【BZOJ1087】【codevs2451】互不侵犯,状压DP
传送门1 传送门2 写在前面:第一次写状压DP,感觉还好,至少比数论好些,还有就是让我膜一发位运算-- 思路:一看数据范围n<=9而且是省选,就知道这个题九成是状态压缩,题目限制条件与上一行的摆 ...
- [BZOJ1087][SCOI2005]互不侵犯King
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行, ...
- BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...
- bzoj 1072: [SCOI2007]排列perm(状压dp)
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2272 Solved: 1432 [Submit][ ...
- BZOJ 4416: [Shoi2013]阶乘字符串【状压DP
--不那么裸的状压dp-- 当字符集大于21的时候直接输出不满足--原因啊----大了就跑不过了 --大概就是不能得到嘛[大佬们并没有讨论出结果在下只是听的题解[x 用f[i][j]表示第i个字符前 ...
最新文章
- Php中如何记录本报时间,详细讲解PHP的日期时间函数date()
- 全套CRC校验的算法
- 基于ajax的数据验证
- python编译成class_django为Form生成的label标签添加class方式
- 学python买什么书-书单狗 篇一:小白学Python,到底要看多少书?
- 线程同步机制的区别与比较及进程通信方法
- 如果同时需要两张表,但其中一个表中没有另一个表中的字段,该如何正确使用
- JAVA笔试题常见坑_java笔试常见的选择题(坑你没商量)
- asp.net mysql 论坛源码_最新asp.net微信商城快速开发框架Magicodes.Shop微商城开发框架源码企业商业版源代码...
- 两个表格内容怎么合并
- 《HarmonyOS开发 – OpenHarmony开发笔记(基于小型系统)》第1章 OpenHarmony与Pegasus物联网开发套件简介
- 圆弧的函数c语言,VC++中Arc函数画圆弧
- Linux 工具 | 第1篇:高级流控-TC+HTB+IFB+内核模块
- matlab拉依达法,基于拉依达准则的奇异数据滤波法.ppt
- 错误 '800a03ea'
- VBA 连接Oracle 数据库
- 顶级计算机语言学大会COLING 2016,亮点迭出一一呈现
- SQLAlchemy 增删改查和基础操作
- 深度对比 Python 与 Java 的区别(一)
- 发那科系统整套梯形图调试维修 FANUC全套PMC设计 发那科标