特殊方格棋盘【状压DP】
特殊方格棋盘【状压DP】
讲真状压DP这个东西只不过是有那么亿丢丢考验心态罢了(确信)
先从板子题说起,另加一些基础知识
题目描述
在的方格棋盘上放置n
个车,某些格子不能放,求使它们不能互相攻击的方案总数。
注意:同一行或同一列只能有一个车,否则会相互攻击
输入格式
输入文件第一行,有两个数n, m ,n
表示方格棋盘大小,m
表示不能放的格子数量
下面有m
行,每行两个整数,为不能放的格子的位置。
输出格式
输出文件也只有一行,即得出的方案总数。
样例
样例输入
2 1
1 1
样例输出
1
思路分析
状压的核心:1. 二进制表示状态
2.位运算进行转移等操作
状压DP的核心就在于用二进制数表示一种状态,其实是一种非常暴力的算法,举个例子:
例如dp[s] [v]中,S可以代表已经访问过的顶点的集合,v可以代表当前所在的顶点为v。S代表的就是一种状态(二进制表示),比如 (11001)2 代表在二进制中{0,3,4}三个顶点已经访问过了,(11001)2 代表的十进制数就是25 ,所以当S为25的时候其实就是代表已经访问过了{0,3,4}三个顶点,那假如一共有5个顶点(标号为01234)的话,所有的顶点都访问完毕应该S为什么呢?是 (11111)2。
关于本题:
这题的约束条件非常非常简单,直接告诉了你哪里不能放,那么我们怎么记录这个所给的约束条件呢?
其实也是用二进制的思想,我们开一个数组a[x],表示第x行的限制,如果第x行的第y列不能放置,那么我们就将其对应的二进制位变为1,这里涉及到了位运算——
a[x] += 1<<(y-1)
;本题还用到了另一个和二进制紧密相关的东西:
int lowbit(int x){return x & -x;}
返回值是最后一个二进制数位为1的位置
转移方程:
int maxs = 1<<n; //显然这是最大的状态,即每个二进制位都是1
for(int s = 1;s < maxs;s++){
int cnt = 0;
for(int i = s;i;i-=lowbit(i))cnt++;//记录二进制1的个数,即放车车的个数(等于行数)
for(int i = s;i;i-=lowbit(i)){ //根据不能放在同一列进行转移
if(!(a[cnt] & lowbit(i))){ //首先要保证该位置可以放
int ss = s^lowbit(i); //异或恰好使得上一行的状态与本行不发生冲突
f[s] += f[ss];
}
}
}
另附一张位运算常用操作:
上代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> const int maxn = (1<<20)-1;
typedef long long ll;
ll f[maxn],a[25]; int lowbit(int x){
return x & -x;
} int main(){
int n,m;scanf("%d%d",&n,&m);
for(int i = 1;i <= m;i++){
int x,y;scanf("%d%d",&x,&y);
a[x] += 1<<(y-1);
}
f[0] = 1;
int maxs = 1<<n;
for(int s = 1;s < maxs;s++){
int cnt = 0;
for(int i = s;i;i-=lowbit(i))cnt++;
for(int i = s;i;i-=lowbit(i)){
if(!(a[cnt] & lowbit(i))){
int ss = s^lowbit(i);
f[s] += f[ss];
}
}
}
printf("%lld\n",f[maxs - 1]);
return 0;
}
发量成功减1%
特殊方格棋盘【状压DP】的更多相关文章
- BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )
状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...
- 棋盘 || 状压DP
题意:有一个n*m的棋盘(n,m≤80,n*m≤80)要在棋盘上放k(k≤20)个棋子,使得任意两个棋子不相邻(每个棋子最多和周围4个棋子相邻).求合法的方案总数. 思路:对于每一行,如果把没有棋子的 ...
- [BZOJ4000][TJOI2015]棋盘(状压DP+矩阵快速幂)
题意极其有毒,注意给的行列都是从0开始的. 状压DP,f[i][S]表示第i行状态为S的方案数,枚举上一行的状态转移.$O(n2^{2m})$ 使用矩阵加速,先构造矩阵a[S1][S2]表示上一行为S ...
- 【BZOJ4000】【LOJ2104】【TJOI2015】棋盘 (状压dp + 矩阵快速幂)
Description 有一个\(~n~\)行\(~m~\)列的棋盘,棋盘上可以放很多棋子,每个棋子的攻击范围有\(~3~\)行\(~p~\)列.用一个\(~3 \times p~\)的矩阵给出了 ...
- 暑假集训Day2 状压dp 特殊方格棋盘
首先声明 : 这是个很easy的题 可这和我会做有什么关系 题目大意: 在n*n的方格棋盘上放置n个车,某些格子不能放,求使它们不能互相攻击的方案总数. 注意:同一行或同一列只能有一个车,否则会相互攻 ...
- HDU 1565&1569 方格取数系列(状压DP或者最大流)
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]
题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...
- HDU 1565 方格取数 状压dp
题目: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. Input 包括多 ...
- POJ 1321 棋盘问题(DFS & 状压DP)
用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...
随机推荐
- java实现第五届蓝桥杯李白打酒
李白打酒 题目描述 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店5 ...
- PAT 反转链表
给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4:如果 K 为 4,则输出应该 ...
- Html/css 水平布局居中
如何设置水平居中显示? 一般的方法是设置宽高,然后以margin去控制,比如:DIV居中的经典方法 本章介绍需要宽度自适应时如何水平居中,以及居中失效的几个点 水平自适应居中 比如设置一个列表水平居中 ...
- C和C++中static的比较
using namespace std; class A{ private: static int a;//由static修饰的变量仅仅是一个声明,不能在此处进行初始化,需要在类的外部初始化. voi ...
- Ubuntu安装protobuf步骤
1.从谷歌官网获取源码 protobuf-2.4.1.tar.gz 2.解压 tar -zxvf protobuf-2.4.1.tar.gz 3.配置 ./configure 4.编译 make 5. ...
- Redis的内存和实现机制
1. Reids内存的划分 数据 内存统计在used_memory中 进程本身运行需要内存 Redis主进程本身运行需要的内存占用,代码.常量池等 缓冲内存,客户端缓冲区.复制积压缓冲区.AOF缓冲区 ...
- [PyQt5]文件对话框QFileDialog的使用
概述选取文件夹 QFileDialog.getExistingDirectory()选择文件 QFileDialog.getOpenFileName()选择多个文件 QFileDialog.getOp ...
- 数据湖&数据仓库,别再傻傻分不清了
摘要:什么是数据湖?它有什么作用?今天将由华为云技术专家从理论出发,将问题抽丝剥茧,从技术维度娓娓道来. 什么是数据湖 如果需要给数据湖下一个定义,可以定义为这样:数据湖是一个存储企业的各种各样原始数 ...
- 安装elasticsearch的坑
elasticsearch启动报“此时不应有 \Common 原因 Java 环境变量出错 解决 修改 elasticsearch.bat , 添加一句 : SET params='%*' SET J ...
- mysql字符串类型(枚举类型)
原文链接:https://blog.csdn.net/qq_34530405/article/details/81738907 本文记录MySql数据库中enum类型数据的使用细节和注意事项. 首先在 ...