AGC004E - Salvage Robots

Solution

怎么又双叒叕遇到和NOIP2020T4NOIP2020T4NOIP2020T4和那道CFCFCF题一样的题了啊,惨痛回忆QAQQAQQAQ。

大概就是把问题看成刚开始的点不动,整个网格图动,机器人向上111格等于网格整体向下111格,左右同理。如果网格某一时刻有一部分在边界外面,就把那些部分切掉,然后把所有经过原点(EEE所在的点)的机器人都收集起来。

因此倘若我们向上、下、左、右分别移动了最多u,d,l,ru,d,l,ru,d,l,r格,那么现在的网格就是[d+1...n−u,r+1...m−l][d+1...n-u,r+1...m-l][d+1...n−u,r+1...m−l]范围内的,然后我们可以选择一个边界位置扩展出去,假设u+1u+1u+1,那么假设移动到了位置(u+1,y),y∈[l,r](u+1,y),y\in[l,r](u+1,y),y∈[l,r],显然对于所有y∈[max(r+1,l),min(m−l,r)]y\in [max(r+1,l),min(m-l,r)]y∈[max(r+1,l),min(m−l,r)],位置(u+1,y)(u+1,y)(u+1,y)上的机器人都可以被收集而不影响边界大小。这里要对边界取max/minmax/minmax/min是因为边界外的机器人都超出过边界消失了。

于是我们有了一个dpdpdp的思路:令fu,d,l,rf_{u,d,l,r}fu,d,l,r​表示向上、下、左、右分别移动了最多u,d,l,ru,d,l,ru,d,l,r格最多收集的机器人。

每次可以从边界往外扩展一格,然后把那个边界上的机器人都加到新的状态里。预处理横纵方向的机器人个数前缀和即可O(1)O(1)O(1)转移。

时间复杂度O(n4)O(n^4)O(n4),空间也是O(n4)O(n^4)O(n4),空间256MB256MB256MB,只能开shortshortshort。

Code

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=1e9+7;
const int MAXN=101;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
int X,Y;
char st[MAXN];
short f[MAXN][MAXN][MAXN][MAXN],sl[MAXN][MAXN],su[MAXN][MAXN];
signed main()
{int n=read(),m=read();for (int i=1;i<=n;i++){scanf("%s",st+1);for (int j=1;j<=m;j++) {if (st[j]=='E') X=i,Y=j;if (st[j]=='o') sl[i][j]=su[i][j]=1;}}for (int i=1;i<=n;i++)for (int j=1;j<=m;j++) sl[i][j]+=sl[i][j-1],su[i][j]+=su[i-1][j];for (int u=0;u<X;u++)for (int d=0;d<=n-X;d++)for (int l=0;l<Y;l++)for (int r=0;r<=m-Y;r++) f[u][d][l][r]=-n*m;f[0][0][0][0]=0;short mx=0;for (int u=0;u<X;u++)for (int d=0;d<=n-X;d++)for (int l=0;l<Y;l++)for (int r=0;r<=m-Y;r++){if (X-(u+1)>=d+1) upmax(f[u+1][d][l][r],(short)(f[u][d][l][r]+sl[X-(u+1)][min(Y+r,m-l)]-sl[X-(u+1)][max(Y-l-1,r)]));if (X+(d+1)<=n-u) upmax(f[u][d+1][l][r],(short)(f[u][d][l][r]+sl[X+(d+1)][min(Y+r,m-l)]-sl[X+(d+1)][max(Y-l-1,r)]));if (Y-(l+1)>=r+1) upmax(f[u][d][l+1][r],(short)(f[u][d][l][r]+su[min(X+d,n-u)][Y-(l+1)]-su[max(X-u-1,d)][Y-(l+1)]));if (Y+(r+1)<=m-l) upmax(f[u][d][l][r+1],(short)(f[u][d][l][r]+su[min(X+d,n-u)][Y+(r+1)]-su[max(X-u-1,d)][Y+(r+1)]));upmax(mx,f[u][d][l][r]);}printf("%d\n",(int)mx);return 0;
}

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 (DP)

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

  4. agc004E Salvage Robots

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

  5. [agc004e]Salvage Robots

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

  6. CSP-S 2019————Emiya 家今天的饭————DP+思维

    题解:本题主要考查DP+思维. 简要题意:一个矩阵,要求每行只选一个节点,每列选的节点不能超过所有选的节点的一半,不能不选,给出每个节点的选择方案数,求总方案数. 1.DP+思维: (1).维护每列已 ...

  7. Ivan the Fool and the Probability Theory-Codeforces Round #594 (Div. 2)-C题(dp+思维)

    Ivan the Fool and the Probability Theory-Codeforces Round #594 (Div. 2)-C题(dp+思维) time limit per tes ...

  8. 【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 ...

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

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

最新文章

  1. airflow sql_alchemy_conn mysql_airflow的安装和使用 - 完全版
  2. Java 反射修改类的常量值、静态变量值、属性值
  3. Linux学习之系统编程篇:单个线程的退出函数
  4. Chrome 74 稳定版发布,Windows 10 支持黑暗模式
  5. 捋一捋PDF、PMF、CDF是什么
  6. matlab在绘图时分数,第三章_Matlab图形绘制试卷.ppt
  7. devsecops_DevSecOps改变安全性的5种方式
  8. MySQL: 查看一次SQL的执行时间都花在哪些环节上
  9. 关于304缓存 (转沫鱼的前端世界)
  10. CF1399C Boats Competition
  11. 老罗Android开发视频教程 15集
  12. 个人介绍网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
  13. Windows网络编程笔记5 -- 其他套接字
  14. PostgreSQL 15新版本特性解读(含直播问答、PPT资料汇总)
  15. SpringCloud使用Feign调用第三方接口
  16. 古籍排版 -古籍重制 - 杨式梨花枪 - 古籍制作 - 古籍制作工具 - 古籍制作软件 - 古籍修复工具 - 古书制作 - 古书制作软件 - 古书修复工具,
  17. 2022强网杯re——find_basic
  18. 今天小暑是什么时间_小暑时间是什么?代表什么?
  19. 从新电脑开始构建FATE环境,图文并茂
  20. linux 快照工具,技术预览:CentOS 7中利用Snapper GUI管理系统快照

热门文章

  1. python 写入excel_一行一行整理EXCEL表太麻烦,试试python脚本,1秒写入数据
  2. python画方波_python实现周期方波信号频谱图
  3. 这几部高分学科纪录片,助力孩子涨姿势拓视野~
  4. 我妈要把闺蜜介绍给我当女朋友......
  5. 教之初计算机考试函数应用题,教之初计算机考试系统
  6. layui html模块化,终于搞懂了layui的模块化
  7. tensorrt轻松部署高性能dnn推理_部署环境之:tensorRT的插件
  8. linux中wine yum安装,分享|在基于RedHat或Debian的系统上安装 Wine 1.7
  9. java 固定长度队列_如何彻底搞懂 Java 数据结构?|CSDN 博文精选
  10. 抖音ai智能机器人挂机_电销秘诀 电销企业难以拒绝的AI智能电销机器人