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);
}

最新文章

  1. iOS-开发者相关的几种证书
  2. 手把手教你在VirtualBox中与主机共享文件夹
  3. Ubuntu用作Server时出现乱码的解决方法
  4. Linux6(5)安装Oracle Rac11g
  5. CSU 1809 Parenthesis(线段树+前缀和)
  6. 第三百二十五天 how can I 坚持
  7. 关于JS中变量的作用域-实例
  8. Android 开发笔记 “java.util.Calendar.compareTo()”
  9. Sql Server实现多行数据按分组用逗号分隔成一行数据
  10. Nginx 虚拟主机下支持Pathinfo并隐藏入口文件的完整配置
  11. QLabel播放gif
  12. sqlserver日期函数大全
  13. MySQL优化技巧总结
  14. (计算几何 线段判交) 51nod1264 线段相交
  15. PHP获取表单并使用数组存储 疯狂提示 Notice: Undefined offset
  16. lzstring
  17. SQL Server 数据库基础笔记分享(上)
  18. [转载]HTML5浏览器测试网站汇总
  19. ISCSI测试
  20. JavaScript入门学习(2)--进度条

热门文章

  1. http协议简析(一)
  2. 云计算 Restfull API 设计之旅
  3. WIFI配置专项测试
  4. [C++] c Struct VS c++ Struct
  5. RedisHelper in C#
  6. ubuntu14.04下安装qt5
  7. Maven常用配置
  8. C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿![转载]
  9. Union、Union All、Intersect、Minus
  10. jQuary总结6:元素的操作