bzoj2755【SCOI2012】喵星人的入侵


输入格式
第一行为三个整数n,m,K,分别表示地图的长和宽,以及最多能放置的炮塔数量。
接下来的n行,每行包含m个字符,‘#’表示地图上原有的障碍,‘.’表示该处为空地,
数据保证在原地图上存在S到T的路径。
输出格式
输出在合理布阵下,喵星人采取最优策略后,会受到的最大伤害。
注意必须保证在布阵结束后喵星人仍然可以沿一条或以上的路径从起点S到达终点T,
否则他们组织更大规模的侵略。
提示
【数据范围】
对于30%的数据,保证:
1<=N,M<=6
对于100%的数据,保证:
1<=N<=6,1<=M<=20,1<=K<=15,且从S到T的路径必定存在。
题解:
- 由于可以无限放置障碍,所以最后一定只会有一条路径;
- 插头$dp$求出路径即可;
- 注意和普通路径不同,路径不能组成四连通块;
#include<bits/stdc++.h>
#define il inline
#define rg register
using namespace std;
const int N=,M=,sz=1e5;
int n,m,K,c1[N],c2[N],cur,ans;
char s[M][M];
struct HASH{
int o,hd[sz],v[sz],w[sz],nt[sz];
il void init(){for(int i=;i<=o;++i)hd[v[i]%sz]=,v[i]=w[i]=nt[i]=;o=;}
il void upd(int x,int y){
for(rg int i=hd[x%sz];i;i=nt[i])if(v[i]==x){
if(w[i]<y)w[i]=y;
return;
}
nt[++o]=hd[x%sz],hd[x%sz]=o,v[o]=x,w[o]=y;
}
}f[][M];
il void upd(int&x,int y){if(x<y)x=y;}
il void decode(int x){
for(rg int i=;i<=m;++i)c1[i]=x&,x>>=;
for(rg int i=;i<=m;++i)c2[i]=x&,x>>=;
}
il int encode(){
int x=;
for(rg int i=m;~i;--i)x=(x<<)^c2[i];
for(rg int i=m;~i;--i)x=(x<<)^c1[i];
return x;
}
il int le(int x){
for(rg int i=x,y=;~i;--i)if(c1[i]&&c1[i]!=){
y+=(c1[i]&)?:-;
if(!y)return i;
}return ;
}
il int ri(int x){
for(rg int i=x,y=;i<=m;++i)if(c1[i]&&c1[i]!=){
y+=(c1[i]&)?:-;
if(!y)return i;
}return ;
}
il int cal1(int x){
int l=max(x-,),r=min(x+,m),re=;
for(rg int i=l;i<=r;++i)if(c2[i]==)re++;
return re;
}
il int cal2(int x){
int l=max(x-,),r=min(x+,m),re=;
for(rg int i=l;i<=r;++i)if(c2[i]==)re++;
return re;
}
il bool check(int j){
for(rg int i=;i<=m;++i)if(i!=j&&i!=j+&&c1[i])return false;
return true;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("C.in","r",stdin);
freopen("C.out","w",stdout);
#endif
scanf("%d%d%d",&n,&m,&K);
for(rg int i=;i<n;++i)scanf("%s",s[i]);
if(n<m){
for(rg int i=;i<n;++i)
for(rg int j=i+;j<m;++j){
swap(s[i][j],s[j][i]);
}
swap(n,m);
}
f[cur=][].upd(,);
for(rg int i=;i<n;++i)
for(rg int j=;j<m;++j){
for(rg int k=;k<=K;++k){
for(rg int l=;l<=f[cur][k].o;++l){
int w=f[cur][k].w[l];
decode(f[cur][k].v[l]);
if(!j){
if(c1[m])continue;
for(rg int i=m;i;--i)c1[i]=c1[i-],c2[i]=c2[i-];
c1[]=c2[]=;
}
/*
{
printf("%d %d %d:\n",i,j,k);
for(int i=0;i<=m;++i)printf("%d ",c1[i]);
puts("");
for(int i=0;i<=m;++i)printf("%d ",c2[i]);
puts("");
printf("%d\n",w);
printf("#\n");
}*/ int &p=c1[j],&q=c1[j+],&r=c2[j],w1=w+cal1(j),w2=w+cal2(j);
int t1=j&&(c2[j-]&),t2=j!=m&&(c2[j+]&);
if(s[i][j]=='#'){
if(p||q)continue;
r=,f[cur^][k].upd(encode(),w);
}else if(!p&&!q){
if(s[i][j]=='.'){
p=,q=;
r=,f[cur^][k].upd(encode(),w);
if(k<K)r=,f[cur^][k+].upd(encode(),w1);
}
if(t1||t2)continue;
if(s[i][j]=='S'||s[i][j]=='T'){
p=,q=,r=,f[cur^][k].upd(encode(),w2);
p=,q=,r=,f[cur^][k].upd(encode(),w2);
}else p=,q=,r=,f[cur^][k].upd(encode(),w2);
}else if(!p||!q){
if(t1&&t2)continue;
if(s[i][j]=='S'||s[i][j]=='T'){
if(p+q!=){
if(p+q==)c1[ri(j)]=;else c1[le(j+)]=;
p=q=,r=,f[cur^][k].upd(encode(),w2);
}
else if(check(j))p=,q=,r=,f[cur^][k].upd(encode(),w2);
}else{
r=,swap(p,q),f[cur^][k].upd(encode(),w2);
r=,swap(p,q),f[cur^][k].upd(encode(),w2);
}
}else{
if(p==&&q==){
p=q=,r=,f[cur^][k].upd(encode(),w2);
}else if(p==||q==){
if(p+q-==)c1[ri(j)]=;
else if(p+q-==)c1[le(j+)]=;
p=q=,r=,f[cur^][k].upd(encode(),w2);
}else {
if(p==&&q==)continue;
if(p==q){
if(p==)c1[ri(j+)]=;
else c1[le(j)]=;
}
p=q=,r=,f[cur^][k].upd(encode(),w2);
}
}
}
f[cur][k].init();
}
cur^=;
}
for(int i=;i<=K;++i)
for(int j=;j<=f[cur][i].o;++j){
decode(f[cur][i].v[j]);
if(check(m+))upd(ans,f[cur][i].w[j]);
}
printf("%d\n",ans);
return ;
}
bzoj2755【SCOI2012】喵星人的入侵的更多相关文章
- 洛谷 P2337 【[SCOI2012]喵星人的入侵】
这几天一直在刷插头Dp,写了几道入门题后,觉得还比较水,直到我发现了这一题.... 题目大意:给你一个n*m的地图,有些是空地,有些是障碍,还有两个是ST,在给你一个L,代表可以放L个炮台,你要在空地 ...
- 插头dp小结
插头dp: \(A:\)插头dp是什么? \(B:\)一种基于连通性状态压缩的动态规划问题 \(A:\)请问有什么应用呢? \(B:\)各种网格覆盖问题,范围允许状压解决,常用于计算方案数与联通块权值 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ_2754__[SCOI2012]_喵星球上的点名_(暴力+后缀数组)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现, ...
- BZOJ 2754([SCOI2012]喵喵叫的星球-统计序列的后缀阵列中子序列出现次数)
2754: [SCOI2012]喵喵叫的星球 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 805 Solved: 380 [id=2754&qu ...
- BZOJ 2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 649 Solved: 305[Submit][Sta ...
- BZOJ2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 680 Solved: 314[Submit][Sta ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [后缀数组+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1906 Solved: 839[Submit][St ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1902 Solved: 837[Submit][St ...
随机推荐
- "api-ms-win-crt-runtime-l1-1-0.dll 丢失"怎么办?详细解决步骤
api-ms-win-crt-runtime-l1-1-0.dll 丢失 电脑找不到api-ms-win-crt-runtime-l1-1-0.dll文件解决方法: 问题描述: 1.开机提示" ...
- 高可用OpenStack(Queen版)集群-6.Nova控制节点集群
参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...
- Go文件右键编译
辛辛苦苦写好了.go文件 发现编译还得敲命令才行,或许配置一个好用点的IDE环境可以解决 但是有时候实在不想开IDE 于是在右键添加了一个编译功能 首先保证go相关的环境变量配置正确 Windows ...
- node上的__dirname和./的区别
概要 Node.js 中,__dirname 总是指向被执行 js 文件的绝对路径,所以当你在 /d1/d2/myscript.js 文件中写了 __dirname, 它的值就是 /d1/d2 . 相 ...
- Python入门学习系列——Python文件和异常
从文件中读取数据 首先准备一个文本文件,文件中存储着普通文本数据.读取文件需要调用open()和read()函数. 读取整个文件 代码示例: with open('pi_digits.txt') as ...
- Python之并发编程-协程
目录 一.介绍 二. yield.greenlet.gevent介绍 1.yield 2.greenlet 3.gevent 一.介绍 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutin ...
- fetch err : "Body not allowed for GET or HEAD requests"
在使用 fetch 的时候 报了 "Body not allowed for GET or HEAD requests" 这个错. 代码如下: 一番google , 找到答案了. ...
- 第33次Scrum会议(11/21)【欢迎来怼】
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/21 11:35~11:57,总计22min.地点:东北 ...
- 软件工程第十周psp
1.PSP表格 2.进度条 3.饼状图 4.折线图
- WebGL学习笔记七点一
第六章讲的是一些GL的一些语法,前面已经涉及,学习时直接跳过,来看第七章,第七章是真正意义的三维立体的出现,其实图形绘制方法是差不多的,就是Z坐标此时不再为0,所以很容易能构造出一些立体图形,但是立体 ...