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 ...
随机推荐
- Ubuntu 22.04 搭建K8s集群
目录 1. 虚拟机基础配置 配置静态ip 设置主机名 设置hosts 安装ssh 2. Ubuntu系统设置 禁用swap 修改内核参数 3. 安装containerd 4. 安装Kubernetes ...
- 分布式计算MapReduce究竟是怎么一回事?
前言 如果要对文件中的内容进行统计,大家觉得怎么做呢?一般的思路都是将不同地方的文件数据读取到内存中,最后集中进行统计.如果数据量少还好,但是面对海量数据.大数据的场景这样真的合适吗?不合适的话,那有 ...
- Spring中11个最常用的扩展点,你知道几个?
前言 在使用spring的过程中,我们有没有发现它的扩展能力很强呢? 由于这个优势的存在,使得spring具有很强的包容性,所以很多第三方应用或者框架可以很容易的投入到spring的怀抱中.今天我们主 ...
- 低代码开发平台YonBuilder移动开发,开发阅读APP教程
设计实现效果如下图: 主要包括书架,阅读,收藏功能. 经过分析,我们可以先实现底部导航功能,和书架列表页面. 1. 使用 tabLayout 高级窗口实现底部导航 . 使用tabLayout 有两 ...
- 封装 avm 组件经验分享
avm.js 是一个跨端开发框架,AVM(Application-View-Model)前端组件化开发模式基于标准Web Components组件化思想,提供包含虚拟DOM和Runtime的编程框架a ...
- GeoLayout: Geometry Driven Room Layout Estimation Based on Depth Maps of Planes
1. 论文简介 论文题目:GeoLayout: Geometry Driven Room Layout Estimation Based on Depth Maps of Planes Paper地址 ...
- Atcoder Beginner Contest ABC 284 Ex Count Unlabeled Graphs 题解 (Polya定理)
题目链接 弱化版(其实完全一样) u1s1,洛谷上这题的第一个题解写得很不错,可以参考 直接边讲Polya定理边做这题 问题引入:n颗珠子组成的手串,每颗珠子有两种不同的颜色, 如果两个手串能够在旋转 ...
- python进阶之路3之数据类型
内容概要 pycharm下载与使用 python语法之注释 python语法之变量与常量 python基本数据类型(先大致了解有哪些) pycharm下载与使用 1.该软件分为收费版和免费版 免费版本 ...
- 03-逻辑综合工具 - Design Compiler
逻辑综合工具DC IC设计流程,市场-->制定spec-->RTL(同时进行sim,通过alint检查RTL有没有错误)-->systhesis(逻辑综合)-->PR(STA) ...
- ng-alain创建组件添加路由导航菜单项基础步骤详解
首先呢~ 我们要在需要创建模块的路径例如AAA目录下,在终端打开(就是和在shell窗口打开一样的) 然后 ng g ng-alain:module XXXmodule 好了,创建了一个模块 接下来会 ...