题目链接

https://atcoder.jp/contests/agc004/tasks/agc004_e

题解

本题的难度不在于想到大体思路,而在于如何把代码写对。。
首先我们可以不让机器人动,让出口和边界一起动。
然后设\(dp[l][r][u][d]\)表示出口往四个方向分别动了最多\(l,r,u,d\)格,最大能圈住几个机器人。
转移以向下为例: 向下转移合法的条件为\(x_0+d<n-u\) (\(x_0,y_0\)为起点坐标),因为出口的位置是\(x_0+d+1\), 而同时要满足点在网格上下边界圈成的合法矩形内,网格下边界的最上位置为\(n-u\).
注意向下合法和向上合法并不等价,比如一种情况是起点离上边界很近离下边界很远,就有可能出现先上后下能完成但是先下后上完不成的情况。
防止MLE可以滚动数组或者开short.

时间复杂度\(O(n^4)\).

代码

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cassert>
#include<cstring>
#include<algorithm>
using namespace std;const int N = 100;
short dp[N+3][N+3][N+3][N+3];
int s[N+3][N+3];
char a[N+3][N+3];
int n,m,sx,sy;int getsum(int lx,int rx,int ly,int ry) {return s[rx][ry]-s[lx-1][ry]-s[rx][ly-1]+s[lx-1][ly-1];}int updmax(short &x,short y) {x = x>y?x:y;}int main()
{scanf("%d%d",&n,&m);for(int i=1; i<=n; i++) scanf("%s",a[i]+1);for(int i=1; i<=n; i++){for(int j=1; j<=m; j++){s[i][j] = (a[i][j]=='o'?1:0)+s[i-1][j]+s[i][j-1]-s[i-1][j-1];if(a[i][j]=='E') {sx = i,sy = j;}}}memset(dp,213,sizeof(dp));dp[0][0][0][0] = 0; short ans = 0;for(int l=0; sy-l>0; l++){for(int r=0; sy+r<=m; r++){for(int u=0; sx-u>0; u++){for(int d=0; sx+d<=n; d++){updmax(ans,dp[l][r][u][d]);int ly = max(1+r,sy-l),ry = min(m-l,sy+r),lx = max(1+d,sx-u),rx = min(n-u,sx+d);
//                  printf("l%d r%d u%d d%d x[%d,%d] y[%d,%d]\n",l,r,u,d,lx,rx,ly,ry);if(sx+d<n-u){updmax(dp[l][r][u][d+1],dp[l][r][u][d]+getsum(sx+d+1,sx+d+1,ly,ry));}if(sx-u>1+d){updmax(dp[l][r][u+1][d],dp[l][r][u][d]+getsum(sx-u-1,sx-u-1,ly,ry));}if(sy+r<m-l){updmax(dp[l][r+1][u][d],dp[l][r][u][d]+getsum(lx,rx,sy+r+1,sy+r+1));}if(sy-l>1+r){updmax(dp[l+1][r][u][d],dp[l][r][u][d]+getsum(lx,rx,sy-l-1,sy-l-1));}}}}}printf("%d\n",(int)ans);return 0;
}

AtCoder AGC004E Salvage Robots (DP)相关推荐

  1. AGC004E - Salvage Robots(dp,思维)

    AGC004E - Salvage Robots Solution 怎么又双叒叕遇到和NOIP2020T4NOIP2020T4NOIP2020T4和那道CFCFCF题一样的题了啊,惨痛回忆QAQQAQ ...

  2. [agc004e]Salvage Robots dp

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

  3. [AGC004E] Salvage Robots (DP)

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

  4. [二维区间DP?] Atcoder ARC004E. Salvage Robots

    可以让出口移动,robots不动 fu,d,l,r f_{u,d,l,r} 表示出口活动的区域为 (x−u,y−l) (x-u,y-l) 到 (x+d,y+r) (x+d,y+r) 这个矩形时最多能救 ...

  5. agc004E Salvage Robots

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

  6. [agc004e]Salvage Robots

    前言 本题的关键是想到让出口和矩形动,而不是机器人动,只要记录出口的位移矩形,便可以知道哪个区域的机器人已经飞出去了. 题目大意 一个网格图,有若干机器人,还有一个出口. 操作一系列指令让机器人上下左 ...

  7. 【AGC004E】Salvage Robots【动态规划dp】

    貌似我的dp和大多数写法不太一样..常数巨大. 我们设 f [ i ] [ j ] [ k ] [ l ] f[i][j][k][l] f[i][j][k][l]为剩下横坐标范围为 i t o j i ...

  8. atcoder【AGC004E】Salvage Robots

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

  9. 【国集作业】【AGC004E】Salvage Robots 【DP】

    小视野链接 洛谷链接 ###题目大意 一个 n ∗ m n*m n∗m的网格上有一些黑点和一个出口.每次操作使所有黑点向上下左右中的任意一个方向移动一格.若移出边界则消失,移至出口则收集起来.问最终收 ...

最新文章

  1. Asp.net based Web Application部署后的问题
  2. mysql vim_MySQL的安装配置
  3. ASP读取ACCESS数据库随机记录的方法
  4. CodeForces - 1118F1 Tree Cutting (Easy Version)(树形dp)
  5. [bzoj 4811] 由乃的OJ(贪心 + 树链剖分)
  6. 上次那个上门要源代码的女网红,后来咋样了?
  7. Windows Server 2012的服务管理自动化
  8. FindBugs插件的安装与使用
  9. 2003年考研数学一答案解析pdf
  10. 2021美国大学生数学建模竞赛D题
  11. 【⚠️windows删除文件夹抽风了⚠️】“错误0x80070091:目录不是空的”问题处理
  12. charles(抓包神器)
  13. 走ORACLE后门cusor_sharing的问题
  14. 鬼吹灯java攻略_密室逃脱鬼吹灯攻略完美过关图文详解
  15. 【NEUQ】PJ的情书 【哈夫曼树 】
  16. Python 基础 之 jupyter notebook 中机器学习的简单入门书写数字识别 demo 操作学习
  17. matlab画三维图如何更改颜色,matlab画三维图像的示例代码(附demo)
  18. 学习Java可以从事什么工作?
  19. 大学计算机作业互评评语简短,大学生互评评语简短
  20. LX弹幕wss弹幕RPC

热门文章

  1. centos 系统重新安装ssh
  2. 机器学习碎碎念:霍夫丁不等式
  3. python做项目看板_三、使用python数据仓库实现可视化看板
  4. asp.net 读取excel文件
  5. __declspec
  6. UDP协议抓包分析 -- wireshark
  7. 高级C语言教程-编译链接调试
  8. 关于jquerymobile的预加载
  9. 寄存器---汇编学习笔记
  10. spring security认证的底层实现