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\) ...
随机推荐
- 第10组 Alpha冲刺 (3/6)
1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/13971668.html ·作业博客:https://edu.cnblogs.co ...
- 虚拟机上CentOS7网络配置
如果图片损坏:点击链接:https://www.toutiao.com/i6493449418249863693/ 设置网络 首先打开虚拟网络编辑器 权限打开 选择NAT模式,设置IP 应用确定之后, ...
- iView 用renderContent自定义树组件
iview的树组件在有默认选中状态的时候默认选中状态的样式改变有bug,默认选中的样式不好看,鉴于此,有renderContent来改造iview的树组件, 效果如图 代码如下 <templat ...
- dart系列之:手写Library,Library编写最佳实践
目录 简介 使用part和part of src中的文件 package中的lib文件 总结 简介 Library是dart用来组织代码的一种非常有用的方式,通过定义不同的Library,可以将非常有 ...
- 基于Spring实现策略模式
背景: 看多很多策略模式,总结下来实现原理大体都差不多,在这里主要是讲解下自己基于Spring更优雅的实现方案:这个方案主要是看了一些开源rpc和Spring相关源码后的一些思路,所以在此进行总结 首 ...
- [javaweb]strut2-001漏洞分析
Strut2-001 漏洞描述 框架解析JSP页面标签时会对用户输入的Value值获取,在获取对应的Value值中递归解析%{.}造成了二次解析,最终触发表达式注入漏洞,执行任意代码 影响版本 2.0 ...
- 《剑指offer》面试题20. 表示数值的字符串
问题描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100"."5e2"."-123"."3.1 ...
- 个人作业2-Java代码实现数据检索并实现可视化
1.bean实体层 package bean; public class Bean { private String title; private String Abstract; private S ...
- 基础概念(2):怎么用cc来编译?
怎么用cc来编译? 总结卡片: cc的使用可以很简单,指定要转换的程序文件就可以了,比如:cc hello.c. 按cc的规则(我这里是clang-llvm),程序文件以.c或.cpp为后缀. cc有 ...
- jmeter - 阶梯式性能指标监听
概述 我们在进行阶梯式压力测试的时候,聚合报告生成的结果是一个汇总数据.并不会阶梯式的统计压测性能数据.这样我们就不能去对比不同阶梯压力下的性能数据变化趋势. 期望 假设现在一共会加载100个线程,我 ...