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\) ...
随机推荐
- 利用js模拟用户的cookie信息保存
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6814761849708347907/ 默认已完成爬虫文档<爬虫学习文档顺序> 并简单搭建完展示页面和管 ...
- Word文档学习小练习链接
1. < Word2010初学> https://www.toutiao.com/i6487370439910752782/ 2. <Word2010格式化可爱的家乡> htt ...
- 【记录一个问题】铁威马NAS存储,当使用time machine备份的时候,如果再使用手机备份,会导致time machine备份中断
如题 傻机器,无法做到并行备份!
- deepin20搜狗输入法使用
放大打字框 打出中文语句符号
- Windows和Linux关闭占用端口
关闭端口的方式有很多种,但是常用的就是这种比较来的快一点 如果通过以下方式解决不了,可以通过关闭服务来解决 Windows 1.查看端口占用的进程 netstat -ano | findstr 800 ...
- 春节将至,喜庆的烟花安排上(js实现烟花)
一年一度的春节即将来临,然后苦逼的我还在使劲的摸鱼,未能回家体验小时候路边放爆竹的快乐时光,所以只能在网上来实现这个小小的心愿了.烟花静态效果图如下: 为了大伙复制方便就不分开写,直接复制即可,具体实 ...
- yum搭建私有仓库远程版
目录 一:yum安装 1.简介 1.安装 2.卸载 3.更新 4.yum安装的生命周期 二:yum搭建私有仓库(本地版) 1.下载必须的软件包(准备配置) 2.创建软件仓库 3.下载对应的软件 4.初 ...
- linux系统别名
目录 一:系统别名 一:系统别名 alias 格式: alias xxx='命令' alias : 查看系统别名 alias rm='xxx' : 设置系统别名 改别名 别名 执行这个命令 [root ...
- CaCl2 项目介绍。
一 是什么? 中国自然语言处理(NLP)研究项目. 二 主要功能? 从互联网获取的大量文本数据,结合自研力量进行分析.将数据重新格式化为大量条目,目录,并根据金融行业分类标准对这些条目进行了分类. 三 ...
- 利用JGrapht对有向无环图进行广度优先遍历
环境需求:JDK:1.8 jar:jgrapht-core-1.01.jar package edu; import org.jgrapht.experimental.dag.DirectedAcyc ...