传送门

这个题只要想到移动机器人和移动出口是等价的就好做了

考虑设\(f[i][j][k][t]\)为最远向左移动\(i\),向右移动\(j\),向上移动\(k\),向下移动\(t\),这个矩形内最多能救的机器人

转移就记录一个前缀和来辅助转移,这样复杂度就在能通过的范围内了

但是转移还是比较麻烦的,还需要考虑当前状态下哪些机器人是已经死了的

空间有点卡,可以选择开short也可以将第一维滚动

代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<queue>
  6. #include<cmath>
  7. using namespace std;
  8. void read(int &x){
  9. char ch;bool ok;
  10. for(ok=0,ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')ok=1;
  11. for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());if(ok)x=-x;
  12. }
  13. #define rg register
  14. const int maxn=110;
  15. #define max(a,b) ((a)>(b)?(a):(b))
  16. short ans,f[maxn][maxn][maxn][maxn],l[maxn][maxn],r[maxn][maxn];
  17. int n,m,x,y;char s[maxn];
  18. void solve(){
  19. int le=y-1,rt=m-y,up=x-1,dw=n-x;
  20. for(rg int i=0;i<=le;i++)
  21. for(rg int j=0;j<=rt;j++)
  22. for(rg int k=0;k<=up;k++)
  23. for(rg int t=0;t<=dw;t++){
  24. if(y-i-1>j){
  25. int now1=max(x-k,t+1),now2=min(x+t,n-k);
  26. f[i+1][j][k][t]=max(f[i+1][j][k][t],f[i][j][k][t]+r[now2][y-i-1]-r[now1-1][y-i-1]);
  27. }
  28. else f[i+1][j][k][t]=max(f[i+1][j][k][t],f[i][j][k][t]);
  29. if(y+j+1+i<=m){
  30. int now1=max(x-k,t+1),now2=min(x+t,n-k);
  31. f[i][j+1][k][t]=max(f[i][j+1][k][t],f[i][j][k][t]+r[now2][y+j+1]-r[now1-1][y+j+1]);
  32. }
  33. else f[i][j+1][k][t]=max(f[i][j+1][k][t],f[i][j][k][t]);
  34. if(x-k-1>t){
  35. int now1=max(y-i,j+1),now2=min(y+j,m-i);
  36. f[i][j][k+1][t]=max(f[i][j][k+1][t],f[i][j][k][t]+l[x-k-1][now2]-l[x-k-1][now1-1]);
  37. }
  38. else f[i][j][k+1][t]=max(f[i][j][k+1][t],f[i][j][k][t]);
  39. if(x+t+1+k<=n){
  40. int now1=max(y-i,j+1),now2=min(y+j,m-i);
  41. f[i][j][k][t+1]=max(f[i][j][k][t+1],f[i][j][k][t]+l[x+t+1][now2]-l[x+t+1][now1-1]);
  42. }
  43. else f[i][j][k][t+1]=max(f[i][j][k][t+1],f[i][j][k][t]);
  44. }
  45. printf("%d\n",f[le][rt][up][dw]);
  46. }
  47. int main(){
  48. read(n),read(m);
  49. for(rg int i=1;i<=n;i++){
  50. scanf("%s",s+1);
  51. for(rg int j=1;j<=m;j++){
  52. if(s[j]=='E')x=i,y=j;
  53. else if(s[j]=='o')l[i][j]=r[i][j]=1;
  54. }
  55. }
  56. for(rg int i=1;i<=n;i++)
  57. for(rg int j=1;j<=m;j++)
  58. l[i][j]+=l[i][j-1];
  59. for(rg int i=1;i<=m;i++)
  60. for(rg int j=1;j<=n;j++)
  61. r[j][i]+=r[j-1][i];
  62. solve();
  63. }

AT2045 Salvage Robots的更多相关文章

  1. [agc004e]Salvage Robots dp

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

  2. [AGC004E] Salvage Robots (DP)

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

  3. 【agc004e】Salvage Robots

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

  4. AtCoder AGC004E Salvage Robots (DP)

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

  5. agc004E Salvage Robots

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

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

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

  7. AtCoder Grand Contest 004

    AtCoder Grand Contest 004 A - Divide a Cuboid 翻译 给定一个\(A*B*C\)的立方体,现在要把它分成两个立方体,求出他们的最小体积差. 题解 如果有一条 ...

  8. RE:从零开始的AGC被虐(到)生活(不能自理)

    RE:从零开始的AGC被虐(到)生活(不能自理) 「一直注视着你,似近似远,总是触碰不到.」 --来自风平浪静的明天 AtCoder Grand Contest 001 B: Mysterious L ...

  9. AtCoder Grand Contest

    一句话题解 QwQ主要是因为这篇文章写的有点长……有时候要找某一个题可能不是很好找,所以写了这个东西. 具体的题意.题解和代码可以再往下翻._(:з」∠)_ AGC 001 C:枚举中点/中边. D: ...

随机推荐

  1. OpenCV-Python 霍夫直线检测-HoughLinesP函数参数

    cv2.HoughLines()函数是在二值图像中查找直线,cv2.HoughLinesP()函数可以查找直线段. cv2.HoughLinesP()函数原型: HoughLinesP(image, ...

  2. Debian for ARM install python 3.5.x

    /********************************************************************************** * Debian for ARM ...

  3. Simple Rtmp Server的安装与简单使用

    Simple Rtmp Server是一个国人编写的开源的RTMP/HLS流媒体服务器. 功能与nginx-rtmp-module类似, 可以实现rtmp/hls的分发. 有关nginx-rtmp-m ...

  4. bzoj 3280: 小R的烦恼 费用流

    题目: Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要求小R帮助他一起解决一个难题. 问题是这样的,程设老师最近要进行一项 ...

  5. Python:生成器表达式

    转于:http://www.cnblogs.com/liu-shuai/p/6098218.html 博主:刘-帅 简介: 生成器表达式并不真正的创建数字列表,而是返回一个生成器对象,此对象在每次计算 ...

  6. Python命令模块argparse学习笔记(三)

    参数组 ArgumentParser.add_argument_group(title=None, description=None) 默认情况下,当显示帮助消息时,ArgumentParser将命令 ...

  7. delphi 线程教学第一节:初识多线程

    第一节:初识多线程   1.为什么要学习多线程编程?   多线程(多个线程同时运行)编程,亦可称之为异步编程. 有了多线程,主界面才不会因为耗时代码而造成“假死“状态. 有了多线程,才能使多个任务同时 ...

  8. python 基础 序列化

    转自https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138683221577 ...

  9. ViewPage+Fragment(仿微信切换带通知)

    第一步 : 布局文件 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <Li ...

  10. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; che

    出现此种错误,我暂时遇到了两次. 1 我的字段的名称和数据库的关键字重合. 上图中的desc是默认降序排列的意思. 2 第二次出现的异常是我在重构代码阶段遇到的一个bug.不过我暂时不能理解,虽然解决 ...