Description

蛤蟆国的领土我们可以抽象为H*W的笼子,在这片蛤土上,有若干个机器人和一个出口,其余都是空地,每次蛤蟆会要求让所有的机器人向某个方向移动一步,当机器人移动到出口时会被蛤蟆活摘出来,当机器人移出笼子时会自焚,求你最多取出的多少个机器人。

Input

第一行两个整数H,W,如题目所述

接下来H行,每行W个字符,包含三类字符:

第一类是'.'表示空地

第二类是'o'表示有一个机器人

第三类是'E'表示有一个出口,出口有且仅有一个

Output

一行,活摘的机器人个数

Sample Input

3 3
o.o
.Eo
ooo

Sample Output

3

HINT

H,W≤100

补充样例:

3 4
o...
o...
oooE
输出:5
5 11
ooo.ooo.ooo
o.o.o...o..
ooo.oE..o..
o.o.o.o.o..
o.o.ooo.ooo
输出:12

Sol

首先转化成矩形和格子走。

我们设\(f[i][j][k][l]\)表示起点向左最远走过i步,向右最远走过j步,向上最远走过k步,向下最远走过l步能够最大覆盖的机器人数量。

那么我们转移的时候去掉已经出格的,加上转移的时候新增的量即可(一定是一个连续的序列,所以可以用前缀和预处理)。

注意细节边界问题非常多。

开short,否则爆空间。

Code

#include<bits/stdc++.h>
using namespace std;
short f[102][102][102][102],s1[102][102],s2[102][102],ans;int n,m,x,y;char c[102][102];
int main()
{
scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%s",c[i]+1);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(c[i][j]=='E') x=i,y=j;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) s1[i][j]=s1[i][j-1]+(c[i][j]=='o'),s2[i][j]=s2[i-1][j]+(c[i][j]=='o');
for(int a=0;a<x;a++) for(int b=0;b<=n-x;b++) for(int c=0;c<y;c++) for(int d=0;d<=m-y;d++)
{
int U=b+1,D=n-a,L=d+1,R=m-c;ans=max(ans,f[a][b][c][d]);
if(U<x-a) f[a+1][b][c][d]=max((int)f[a+1][b][c][d],f[a][b][c][d]+s1[x-a-1][min(R,y+d)]-s1[x-a-1][max(L,y-c)-1]);
if(x+b<D) f[a][b+1][c][d]=max((int)f[a][b+1][c][d],f[a][b][c][d]+s1[x+b+1][min(R,y+d)]-s1[x+b+1][max(L,y-c)-1]);
if(L<y-c) f[a][b][c+1][d]=max((int)f[a][b][c+1][d],f[a][b][c][d]+s2[min(D,x+b)][y-c-1]-s2[max(U,x-a)-1][y-c-1]);
if(y+d<R) f[a][b][c][d+1]=max((int)f[a][b][c][d+1],f[a][b][c][d]+s2[min(D,x+b)][y+d+1]-s2[max(U,x-a)-1][y+d+1]);
}
printf("%d\n",ans);
}

[agc004e]Salvage Robots dp的更多相关文章

  1. AtCoder AGC004E Salvage Robots (DP)

    题目链接 https://atcoder.jp/contests/agc004/tasks/agc004_e 题解 本题的难度不在于想到大体思路,而在于如何把代码写对.. 首先我们可以不让机器人动,让 ...

  2. [AGC004E] Salvage Robots (DP)

    Description 蛤蟆国的领土我们可以抽象为H*W的笼子,在这片蛤土上,有若干个机器人和一个出口,其余都是空地,每次蛤蟆会要求让所有的机器人向某个方向移动一步,当机器人移动到出口时会被蛤蟆活摘出 ...

  3. agc004E Salvage Robots

    题意: 一个网格图,有若干机器人,还有一个出口. 操作一系列指令让机器人一起上下左右走,走出矩形就死,进入出口则得救. 最多救多少机器人? $W,H \leq 100$ 考虑不让所有机器人移动,而让出 ...

  4. 【agc004e】Salvage Robots

    题目大意 一个n*m的矩阵,矩阵内有一个出口和若干个机器人,每一步操作可以使所有的机器人向任意方向移动一格,如果机器人出了边界就爆炸.求最多可以让多少个机器人走到出口. 解题思路 发现,移动所有机器人 ...

  5. codeforces ~ 1004 C Sonya and Robots (dp)

    C. Sonya and Robots time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. ABC 158 F - Removing Robots dp 单调栈

    LINK:Removing Robots 没想到 自闭. 考虑了一个容斥 发现不合法方案难以计算. 就算可以计算也几乎是n^2的做法. 考虑dp 左边会对右边产生影响 所以考虑先dp右边的再考虑左边的 ...

  7. AT2045 Salvage Robots

    传送门 这个题只要想到移动机器人和移动出口是等价的就好做了 考虑设\(f[i][j][k][t]\)为最远向左移动\(i\),向右移动\(j\),向上移动\(k\),向下移动\(t\),这个矩形内最多 ...

  8. Solution -「AGC 004E」「AT 2045」Salvage Robots

    \(\mathcal{Description}\)   Link.   有一个 \(n\times m\) 的网格.每个格子要么是空的,要么有一个机器人,要么是一个出口(仅有一个).每次可以命令所有机 ...

  9. 多校联训 DP 专题

    [UR #20]跳蚤电话 将加边变为加点,方案数为 \((n-1)!\) 除以一个数,\(dp\) 每种方案要除的数之和即可. 点击查看代码 #include<bits/stdc++.h> ...

随机推荐

  1. 201671010140. 2016-2017-2 《Java程序设计》java学习第十周

    ---恢复内容开始--- Java学习第十周       本周,学习泛型程序设计,泛型也被称为参数化类型(parameterized type),就是在定义类.接口和方法时,通过类型参数指示将要处理的 ...

  2. 使用RampTexture实现BRDF效果

    [使用RampTexture实现BRDF效果] BRDF stands for bidirectional reflectance distribution function. While that ...

  3. Gouraud Shading

    [Gouraud Shading] Gouraud Shading (高洛德着色/高氏着色) 这种着色的效果要好得多,也是在游戏中使用最广泛的一种着色方式.它可对3D模型各顶点的颜色进行平滑.融合处理 ...

  4. Eclipse快捷键大全(补充)

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+Shift+O 自动导入所需要的包(这个用的次数也相当多)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增 ...

  5. VUE+WebPack实现精美前端游戏:CardBattle的游戏场景设置

    C:\Users\ZHONGZHENHUA\cardBattle\src\App.vue src/App.vue <template> <div id="app" ...

  6. 【LA3126 训练指南】出租车 【DAG最小路径覆盖】

    题意 你在一座城市里负责一个大型活动的接待工作.明天将有m位客人从城市的不同的位置出发,到达他们各自的目的地.已知每个人的出发时间,出发地点和目的地.你的任务是用尽量少的出租车送他们,使得每次出租车接 ...

  7. Nginx源码完全注释(9)nginx.c: ngx_get_options

    本文分析 ngxin.c 中的 ngx_get_options 函数,其影响: nginx.c 中的: static ngx_uint_t ngx_show_help; static ngx_uint ...

  8. Unity3D UI史

    http://www.cnblogs.com/hammerc/p/4837204.html 扫码时备注或说明中留下邮箱付款后如未回复请至https://shop135452397.taobao.com ...

  9. Listview getItemViewType的使用

    ListView中有两个可以用来让ListView可以在视图中显示多种布局的方法,分别是getItemType和getViewTypeCount 其中 getItemViewType返回的是有参数po ...

  10. 搭建yum本地源_阿里云CentOS服务器初始化设置

    CentOS服务器初始化设置其实不分阿里云或其它服务器了,操作配置过程与步骤也差不多一.挂载硬盘 1.磁盘分区 fdisk -l #查看设备,一般可以看到设备名为/dev/xvdb fdisk /de ...