CF845F - Guards In The Storehouse
题意:在 \((x,y)\) 放一个哨兵,可以监视本行后面的所有格子直到障碍、本列后面所有的格子直到障碍。求使全盘最多一个位置不被监视的方案总数。
我们发现,因为 \(nm\le 250\),所以 \(\min(n,m)\le 15\)。我们选择较小的这个作为 \(n\),另一个作为 \(m\) 进行状压。
设计状态 \(dp_{x,y,msk,i,j}\) 表示当前 \(dp\) 到位置 \((x,y)\),\(msk_k=1\) 的行已经被左边的哨兵监视了,当前有/没有没有被监视的位置,当前位置有/没有被上面的哨兵监视。
我们的转移是:
如果当前是障碍,则把所有状态往 \(\{msk \wedge(2^{15}-1-2^{x}),i,0\}\) 转移。
如果当前是空地:
\begin{cases}
\text{ 当前的位置自己填了}: dp_{msk,i,j}\rightarrow dp_{msk\vee(2^x),i,1}\\
\text{ 没填,当前的位置被上面的覆盖了}: dp_{msk,i,1}\rightarrow dp_{msk,i,1}\\
\text{ 没填,上面不能覆盖,被左边覆盖}: dp_{msk,i,0}[msk_x=1]\rightarrow dp_{msk,i,0}\\
\text{ 没填,没有被覆盖}: dp_{msk,0,0}[msk_x=0]\rightarrow dp_{msk,1,0}
\end{cases}
\end{aligned}\]
注意,这里存在一个问题,就是每一列 \(\text{dp}\) 结束之后要清空 \(j\),但是这样就需要分类讨论。我们可以把矩阵设成 \(n+1\) 行,第 \(n+1\) 行都是障碍,这样更换列的时候就会天然把 \(j\) 清掉。
我们可以滚动掉 \(x\) 和 \(y\),设计 \(dp\) 和 \(tmp\),转移的时候从 \(dp\) 往 \(tmp\) 转移,结束之后把 \(tmp\) 复制到 \(dp\),好处还在于 \(x\) 和 \(y\) 以及上一轮的 \(x'\) 和 \(y'\) 只存在于循环变量中,并不参与 \(dp\) 转移的过程。
const ll P=1000000007;
int n,m,a[255][255],b[255][255],p[255][255],cnt=0;
int dp[1<<16][2][2],tmp[1<<16][2][2];
st s;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
rp(i,n){
cin>>s;
rp(j,m)if(s[j-1]=='.')a[i][j]=1;
}
if(n>m){
swap(n,m);
rp(i,n)rp(j,m)b[i][j]=a[j][i];
rep(i,0,n+1)rep(j,0,m+1)a[i][j]=0;
rp(i,n)rp(j,m)a[i][j]=b[i][j];
}
dp[0][0][0]=1;
rp(y,m)rp(x,n+1){
rd(i,1<<(n+2))rd(j,2)rd(k,2)tmp[i][j][k]=0;
if(!a[x][y]){
rd(msk,1<<(n+2))rd(j,2)rd(k,2)
if(msk>>x&1)tmp[msk^(1<<x)][j][0]=(tmp[msk^(1<<x)][j][0]+dp[msk][j][k])%P;
else tmp[msk][j][0]=(tmp[msk][j][0]+dp[msk][j][k])%P;
}else{
rd(msk,1<<(n+2))rd(j,2)rd(k,2)
tmp[msk|(1<<x)][j][1]=(tmp[msk|(1<<x)][j][1]+dp[msk][j][k])%P;
rd(msk,1<<(n+2))rd(j,2)
tmp[msk][j][1]=(tmp[msk][j][1]+dp[msk][j][1])%P;
rd(msk,1<<(n+2))rd(j,2)if(msk>>x&1)
tmp[msk][j][0]=(tmp[msk][j][0]+dp[msk][j][0])%P;
rd(msk,1<<(n+2))if(!(msk>>x&1))
tmp[msk][1][0]=(tmp[msk][1][0]+dp[msk][0][0])%P;
}
rd(i,1<<(n+2))rd(j,2)rd(k,2)dp[i][j][k]=tmp[i][j][k];
}
int ans=0;
rd(i,1<<(n+2))rd(j,2)rd(k,2)ans=(ans+dp[i][j][k])%P;
cout<<ans<<endl;
return 0;
}
//Crayan_r
CF845F - Guards In The Storehouse的更多相关文章
- 【CF845F】Guards In The Storehouse 插头DP
[CF845F]Guards In The Storehouse 题意:一个n*m的房间,每个格子要么是障碍要么是空地.对于每个空地你可以选择放或者不放守卫.一个守卫能保护到的位置是:他右面的一行空地 ...
- Educational Codeforces Round 27 F. Guards In The Storehouse
F. Guards In The Storehouse time limit per test 1.5 seconds memory limit per test 512 megabytes inpu ...
- 【二分答案+贪心】UVa 1335 - Beijing Guards
Beijing was once surrounded by four rings of city walls: the Forbidden City Wall, the Imperial City ...
- LA 3177 Beijing Guards(二分法 贪心)
Beijing Guards Beijing was once surrounded by four rings of city walls: the Forbidden City Wall, the ...
- uva 1335 - Beijing Guards(二分)
题目链接:uva 1335 - Beijing Guards 题目大意:有n个人为成一个圈,其中第i个人想要r[i]种不同的礼物,相邻的两个人可以聊天,炫耀自己的礼物.如果两个相邻的人拥有同一种礼物, ...
- UVA 11080 - Place the Guards(二分图判定)
UVA 11080 - Place the Guards 题目链接 题意:一些城市.之间有道路相连,如今要安放警卫,警卫能看守到当前点周围的边,一条边仅仅能有一个警卫看守,问是否有方案,假设有最少放几 ...
- UVALive 3177 Beijing Guards
题目大意:给定一个环,每个人要得到Needi种物品,相邻的人之间不能得到相同的,问至少需要几种. 首先把n=1特判掉. 然后在n为偶数的时候,答案就是max(Needi+Needi+1)(包括(1,n ...
- Less的guards and argument matching
less guards/argument matching: .setbackground(@number) when (@number>0){ .setbackground( @number ...
- Nordic Collegiate Programming Contest 2015 G. Goblin Garden Guards
In an unprecedented turn of events, goblins recently launched an invasion against the Nedewsian city ...
- Erlang function guards NOTE
Note: I've compared , and ; in guards to the operators andalso and orelse. They're not exactly the s ...
随机推荐
- 【PostgreSQL】PG通过SQL语句读取二进制bytea类型并进行二进制和十六进制转换
1.将二进制编码为十六进制 select encode("AUUID_0",'hex'),"AUUID_0" from wxf_test."ABANK ...
- Mysql安装失败-GPG验证不通过或Failed to start mariadb.service: Unit not fou
1.报错原因 报错原文 Key imported successfully Import of key(s) didn't help, wrong key(s)? Public key for mys ...
- PHP 视频源文件加密方案
先说下原理:因为视频是付费的,肯定需要作视频加密处理. 加密可实现的方式:修改视频字节流,只能替换字节流,例如头100-1024字节进行加密,源文件就无法打开了. 下面上代码吧,加解密是 openss ...
- Redis的数据复制
介绍 Redis 的复制 Redis 的复制功能分为同步(sync)和命令传播(command propagate)这两个操作 同步操作用于,将从服务器的数据库状态更新至主服务器当前所处的数据库状态: ...
- js 非空判断
是否为 null 是否为 "" 是否为空字符串(引号中间有空格) 如: " ". 制表符.换行符.换页符和回车 一. 字符串 1. if(str == ...
- 万字长文解析Scaled YOLOv4模型(YOLO变体模型)
一,Scaled YOLOv4 摘要 1,介绍 2,相关工作 2.1,模型缩放 3,模型缩放原则 3.1,模型缩放的常规原则 3.2,为低端设备缩放的tiny模型 3.3,为高端设备缩放的Large模 ...
- Hadoop详解(07) - Hdfs数据压缩
Hadoop详解(07) - Hdfs数据压缩 概述 压缩技术能够有效减少底层存储系统(HDFS)读写字节数.压缩提高了网络带宽和磁盘空间的效率.在运行MR程序时,I/O操作.网络数据传输. Shuf ...
- mysql游标最后一行重复问题
今天用调用存储过程时发现数据有点问题,和预期不一致 经排查,发现是游标在遍历过程中重复遍历了,或者说是对游标下标的判断有Bug 调试后发现是游标使用方式不正确 应该在循环外先对游标进行一次取值操作,在 ...
- 为什么网络I/O会被阻塞?
摘要:I/O 其实就是 input 和 output 的缩写,即输入/输出. 本文分享自华为云社区<为啥网络IO会被阻塞呢>,作者: 龙哥手记. 我们应该都知道 socket(套接字),你 ...
- Java线程诊断
1.诊断CPU占用过高 [root@master ~]# nohup java -jar JvmProject.jar & // 有问题的java程序 [1] 1627 [root@maste ...