\(\mathcal{Description}\)

  Link.

  有一个 \(n\times m\) 的网格。每个格子要么是空的,要么有一个机器人,要么是一个出口(仅有一个)。每次可以命令所有机器人向上下左右中的某个方向同时移动一格,如果某个机器人超出了棋盘的边界就会死亡。如果它到了出口的位置就会获救。求获救机器人的最大值。

  \(n,m\le100\)。

\(\mathcal{Solution}\)

  换系,以任一机器人为参考系,使出口成为唯一的动点。设 \(f(u,d,l,r)\) 表示出口向上最多移 \(u\) 格,向下最多移 \(d\) 格,向左最多移 \(l\) 格,向右最多移 \(r\) 格,最多能救到的机器人数量。

  故 \(f(0,0,0,0)=0\) 为初始状态,考虑向上下左右四个方向转移。但需要注意,出口的移动会导致网格外层的一些机器人死亡。如图:

  以图为例,有 \(f(u,d+1,l,r)=f(u,d,l,r)+\operatorname{count}(purple)\),\(f(u,d,l,r+1)=f(u,d,l,r)+\operatorname{count}(green)\)。

  总之,亿 点 细 节 即可。

\(\mathcal{Code}\)

  用 short 卡空间不香嘛 qwq~

#include <cstdio>

#define int short
#define int32 signed const int MAXN = 100;
int n, m, er, ec, srow[MAXN + 5][MAXN + 5], scol[MAXN + 5][MAXN + 5];
int f[MAXN + 1][MAXN + 1][MAXN + 1][MAXN + 1]; inline void chkmax ( int& a, const int b ) { if ( a < b ) a = b; }
inline int max_ ( const int a, const int b ) { return a < b ? b : a; }
inline int min_ ( const int a, const int b ) { return a < b ? a : b; } inline int rsum ( const int row, const int l, const int r ) {
return l > r ? 0 : srow[row][r] - srow[row][l - 1];
} inline int csum ( const int col, const int u, const int d ) {
return u > d ? 0 : scol[col][d] - scol[col][u - 1];
} int32 main () {
int32 tn, tm; char str[MAXN + 5];
scanf ( "%d %d", &tn, &tm ), n = tn, m = tm;
for ( int i = 1; i <= n; ++ i ) {
scanf ( "%s", str + 1 );
for ( int j = 1; j <= m; ++ j ) {
if ( str[j] == 'E' ) er = i, ec = j;
srow[i][j] = srow[i][j - 1] + ( str[j] == 'o' );
scol[j][i] = scol[j][i - 1] + ( str[j] == 'o' );
}
}
int umx = er - 1, dmx = n - er, lmx = ec - 1, rmx = m - ec;
for ( int u = 0; u <= umx; ++ u ) {
for ( int d = 0; d <= dmx; ++ d ) {
for ( int l = 0; l <= lmx; ++ l ) {
for ( int r = 0, cur, aliveL, aliveR, aliveU, aliveD; r <= rmx; ++ r ) {
cur = f[u][d][l][r];
aliveL = max_ ( r + 1, ec - l ), aliveR = min_ ( m - l, ec + r );
chkmax ( f[u + 1][d][l][r],
cur + ( er - u - 1 >= d + 1 ? rsum ( er - u - 1, aliveL, aliveR ) : 0 ) );
chkmax ( f[u][d + 1][l][r],
cur + ( er + d + 1 <= n - u ? rsum ( er + d + 1, aliveL, aliveR ) : 0 ) ); aliveU = max_ ( d + 1, er - u ), aliveD = min_ ( n - u, er + d );
chkmax ( f[u][d][l + 1][r],
cur + ( ec - l - 1 >= r + 1 ? csum ( ec - l - 1, aliveU, aliveD ) : 0 ) );
chkmax ( f[u][d][l][r + 1],
cur + ( ec + r + 1 <= m - l ? csum ( ec + r + 1, aliveU, aliveD ) : 0 ) );
}
}
}
}
int32 ans = f[umx][dmx][lmx][rmx];
printf ( "%d\n", ans );
return 0;
}

Solution -「AGC 004E」「AT 2045」Salvage Robots的更多相关文章

  1. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  2. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  3. 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇

    http://www.4gamer.net/games/216/G021678/20140714079/     连载第2回的本回,  Arc System Works开发的格斗游戏「GUILTY G ...

  4. Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory

    Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...

  5. SSH连接时出现「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」解决办法

    用ssh來操控github,沒想到連線時,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」,後面還有一大串英文,這時當然要向Google大神求助 ...

  6. 「Windows MFC 」「Edit Control」 控件

    「Windows MFC 」「Edit Control」 控件

  7. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  8. Loj #6069. 「2017 山东一轮集训 Day4」塔

    Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...

  9. Loj #6073.「2017 山东一轮集训 Day5」距离

    Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...

随机推荐

  1. vue3.0+vue-cli3.0项目搭建

    因为需要兼容其他vue2.0的项目,所以先卸载vue-cli,再全局安装桥接工具 卸载vue-cli2.0 npm uninstall vue-cli -g 安装vue-cli3.0 npm inst ...

  2. CSS命名规范整理

    基于网易NEC修改后,整理的命名规范 单行写完一个选择器定义 便于选择器的寻找和阅读,也便于插入新选择器和编辑,便于模块等的识别.去除多余空格,使代码紧凑减少换行. 如果有嵌套定义,可以采取内部单行的 ...

  3. kali linux2020 虚拟机改root密码

    kali在2020版的更新中,好多小伙伴登不进root账号,这里来教大家怎样改root账户的密码 1.当我们打开虚拟机看到这个界面的时候,按e进入编辑模式 2.在编辑模式中,"quite s ...

  4. leetcode 1288. 删除被覆盖区间

    问题描述 给你一个区间列表,请你删除列表中被其他区间所覆盖的区间. 只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖. 在完成所有删除操作后 ...

  5. spring 事务失效的几种场景

    以下场景是基于mysql数据库,InnoDB的存储引擎. 一.没有添加@Transactional注解 二.方法声明是private或者static 三.没有抛出异常而是try catch了异常 下面 ...

  6. Cesium入门9 - Loading and Styling Entities - 加载和样式化实体

    Cesium入门9 - Loading and Styling Entities - 加载和样式化实体 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://c ...

  7. C++11多线程之future(一)

    // ConsoleApplication5.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include<random> #in ...

  8. 安装python3.6,设为默认,yum不能用

    安装python3.6 1.安装依赖包 yum -y install wget sqlite-devel xz gcc automake zlib-devel openssl-devel epel-r ...

  9. 微服务架构 | 4.2 基于 Feign 与 OpenFeign 的服务接口调用

    目录 前言 1. OpenFeign 基本知识 1.1 Feign 是什么 1.2 Feign 的出现解决了什么问题 1.3 Feign 与 OpenFeign 的区别与对比 2. 在服务消费者端开启 ...

  10. Avoiding the Backup of Online Redo Logs

    Although it may seem that you should back up online redo logs along with the datafiles and control f ...