Solution -「AGC 004E」「AT 2045」Salvage Robots
\(\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的更多相关文章
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- 「题解」「美团 CodeM 资格赛」跳格子
目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...
- 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇
http://www.4gamer.net/games/216/G021678/20140714079/ 连载第2回的本回, Arc System Works开发的格斗游戏「GUILTY G ...
- Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory
Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...
- SSH连接时出现「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」解决办法
用ssh來操控github,沒想到連線時,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」,後面還有一大串英文,這時當然要向Google大神求助 ...
- 「Windows MFC 」「Edit Control」 控件
「Windows MFC 」「Edit Control」 控件
- 「ZJOI2019」&「十二省联考 2019」题解索引
「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...
- Loj #6069. 「2017 山东一轮集训 Day4」塔
Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...
- Loj #6073.「2017 山东一轮集训 Day5」距离
Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...
随机推荐
- Python常用功能函数总结系列
Python常用功能函数系列总结(一) 常用函数一:获取指定文件夹内所有文件 常用函数二:文件合并 常用函数三:将文件按时间划分 常用函数四:数据去重 Python常用功能函数系列总结(二) 常用函数 ...
- Python操作数据库实战
pymysql # -*- coding: utf-8 -*- """ @Datetime: 2018/12/26 @Author: Zhang Yafei " ...
- python实现掘金定时签到抽奖
python实现掘金定时签到抽奖 一. 概述 这里记录一下使用 python 实现掘金定时签到抽奖.首先需要登录掘金,进入签到页面,按 F12 打开浏览器的调试面板,选择 Network,选择 XHR ...
- Web开发之Servlet
当一个请求到达服务端,服务器怎么处理? 当一个请求到达服务端时,由服务端的引擎来进行分析.它根据工程名找到工程, 然后拿到URL的资源地址和web.XML文件的所有的进行对比,和哪一个对比上就找到了具 ...
- 【刷题-LeetCode】300. Longest Increasing Subsequence
Longest Increasing Subsequence Given an unsorted array of integers, find the length of longest incre ...
- Cesium中文网——如何开发一款地图下载工具[一]
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium中文网的朋友们的其中一个主题是:自己独立开发一款地图 ...
- 如何根据经纬度计算地面上某点在XYZ空间直角坐标系中的坐标
如何根据经纬度计算地面上某点在XYZ空间直角坐标系中的坐标 /** * @param r: number 到地心的距离 * @param lon: number 经度 * @param lat: nu ...
- 论文解读GALA《Symmetric Graph Convolutional Autoencoder for Unsupervised Graph Representation Learning》
论文信息 Title:<Symmetric Graph Convolutional Autoencoder for Unsupervised Graph Representation Learn ...
- RocketMq如何顺序消费的消息offest
RocketMq对于消费者对于消息的如何处理的 1:如果设置了自动提交 返回: ConsumeOrderlyStatus.COMMIT, ConsumeOrderlyStatus.ROLLBACK, ...
- 社交网络分析的 R 基础:(三)向量、矩阵与列表
在第二章介绍了 R 语言中的基本数据类型,本章会将其组装起来,构成特殊的数据结构,即向量.矩阵与列表.这些数据结构在社交网络分析中极其重要,本质上对图的分析,就是对邻接矩阵的分析,而矩阵又是由若干个向 ...