AtCoder AGC004E Salvage Robots (DP)
题目链接
https://atcoder.jp/contests/agc004/tasks/agc004_e
题解
本题的难度不在于想到大体思路,而在于如何把代码写对。。
首先我们可以不让机器人动,让出口和边界一起动。
然后设\(dp[l][r][u][d]\)表示出口往四个方向分别动了最多\(l,r,u,d\)格,最大能圈住几个机器人。
转移以向下为例: 向下转移合法的条件为\(x_0+d<n-u\) (\(x_0,y_0\)为起点坐标),因为出口的位置是\(x_0+d+1\), 而同时要满足点在网格上下边界圈成的合法矩形内,网格下边界的最上位置为\(n-u\).
注意向下合法和向上合法并不等价,比如一种情况是起点离上边界很近离下边界很远,就有可能出现先上后下能完成但是先下后上完不成的情况。
防止MLE可以滚动数组或者开short.
时间复杂度\(O(n^4)\).
代码
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cassert>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100;
short dp[N+3][N+3][N+3][N+3];
int s[N+3][N+3];
char a[N+3][N+3];
int n,m,sx,sy;
int getsum(int lx,int rx,int ly,int ry) {return s[rx][ry]-s[lx-1][ry]-s[rx][ly-1]+s[lx-1][ly-1];}
int updmax(short &x,short y) {x = x>y?x:y;}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) scanf("%s",a[i]+1);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
s[i][j] = (a[i][j]=='o'?1:0)+s[i-1][j]+s[i][j-1]-s[i-1][j-1];
if(a[i][j]=='E') {sx = i,sy = j;}
}
}
memset(dp,213,sizeof(dp));
dp[0][0][0][0] = 0; short ans = 0;
for(int l=0; sy-l>0; l++)
{
for(int r=0; sy+r<=m; r++)
{
for(int u=0; sx-u>0; u++)
{
for(int d=0; sx+d<=n; d++)
{
updmax(ans,dp[l][r][u][d]);
int ly = max(1+r,sy-l),ry = min(m-l,sy+r),lx = max(1+d,sx-u),rx = min(n-u,sx+d);
// printf("l%d r%d u%d d%d x[%d,%d] y[%d,%d]\n",l,r,u,d,lx,rx,ly,ry);
if(sx+d<n-u)
{
updmax(dp[l][r][u][d+1],dp[l][r][u][d]+getsum(sx+d+1,sx+d+1,ly,ry));
}
if(sx-u>1+d)
{
updmax(dp[l][r][u+1][d],dp[l][r][u][d]+getsum(sx-u-1,sx-u-1,ly,ry));
}
if(sy+r<m-l)
{
updmax(dp[l][r+1][u][d],dp[l][r][u][d]+getsum(lx,rx,sy+r+1,sy+r+1));
}
if(sy-l>1+r)
{
updmax(dp[l+1][r][u][d],dp[l][r][u][d]+getsum(lx,rx,sy-l-1,sy-l-1));
}
}
}
}
}
printf("%d\n",(int)ans);
return 0;
}
AtCoder AGC004E Salvage Robots (DP)的更多相关文章
- [agc004e]Salvage Robots dp
Description 蛤蟆国的领土我们可以抽象为H*W的笼子,在这片蛤土上,有若干个机器人和一个出口,其余都是空地,每次蛤蟆会要求让所有的机器人向某个方向移动一步,当机器人移动到出口时会被蛤蟆活摘出 ...
- [AGC004E] Salvage Robots (DP)
Description 蛤蟆国的领土我们可以抽象为H*W的笼子,在这片蛤土上,有若干个机器人和一个出口,其余都是空地,每次蛤蟆会要求让所有的机器人向某个方向移动一步,当机器人移动到出口时会被蛤蟆活摘出 ...
- agc004E Salvage Robots
题意: 一个网格图,有若干机器人,还有一个出口. 操作一系列指令让机器人一起上下左右走,走出矩形就死,进入出口则得救. 最多救多少机器人? $W,H \leq 100$ 考虑不让所有机器人移动,而让出 ...
- 【agc004e】Salvage Robots
题目大意 一个n*m的矩阵,矩阵内有一个出口和若干个机器人,每一步操作可以使所有的机器人向任意方向移动一格,如果机器人出了边界就爆炸.求最多可以让多少个机器人走到出口. 解题思路 发现,移动所有机器人 ...
- codeforces ~ 1004 C Sonya and Robots (dp)
C. Sonya and Robots time limit per test 1 second memory limit per test 256 megabytes input standard ...
- AtCoder AGC001E BBQ Hard (DP、组合计数)
题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_e 题解: 求\(\sum^n_{i=1}\sum^n_{j=i+1} {A_i+A_j+B ...
- AtCoder AGC009E Eternal Average (DP)
题目链接 https://atcoder.jp/contests/agc009/tasks/agc009_e 题解 又被劝退了... 第一步转化非常显然: 就等价于一开始有一个数\(1\), 有\(\ ...
- AtCoder AGC032D Rotation Sort (DP)
题目链接 https://atcoder.jp/contests/agc032/tasks/agc032_d 题解 又是一道神仙题啊啊啊啊...atcoder题真的做不来啊QAQ 第一步又是神仙转化: ...
- Atcoder ARC101 E 树dp
https://arc101.contest.atcoder.jp/tasks/arc101_c 题解是也是dp,好像是容斥做的,但是看不懂,而且也好像没讲怎么变n^2,看了写大佬的代码,自己理解了一 ...
随机推荐
- Linq操作之Except,Distinct,Left Join 【转】
最近项目中用到了Linq中Except,Distinct,Left Join这几个运算,这篇简单的记录一下这几种情形. Except 基础类型使用Linq的运算很简单,下面用来计算两个集合的 ...
- 【weixin】微信支付---Native支付模式二(PC端支付大多采用此模式)
[模式二]:商户后台系统调用微信支付[统一下单API]生成预付交易,将接口返回的链接生成二维码,用户扫码后输入密码完成支付交易.注意:该模式的预付单有效期为2小时,过期后无法支付 模式二与模式一相比, ...
- Java基础第四天--常用API
常用API 基本类型包装类概述 将基本数据类型封装成对象的好处可以在对象中定义更多的功能方法操作该数据 常用的操作之一:用于基本数据类型与字符串之间的转换 基本数据类型 包装类 byte Byte s ...
- STL之Deque的使用方法
STL 中类 stack 实现了一个栈 1)push 能够插入元素 2)pop 移除栈顶元素 使用的时候,需要包含头文件 #include <stack>,stack 被声明如下: nam ...
- 使用WSGI创建REST接口
问题 你想使用一个简单的REST接口通过网络远程控制或访问你的应用程序,但是你又不想自己去安装一个完整的web框架. 解决方案 构建一个REST风格的接口最简单的方法是创建一个基于WSGI标准(PEP ...
- js对象的所有方法
Object构造方法 Object.assign() 将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象. Object.create() 用指定的原型对象和属性创建一个新对象. Object ...
- 关于SAMBA的关键参考资源
https://www.samba.org/samba/docs/man/ https://devel.samba.org/ http://www.ubiqx.org/cifs/ https://ww ...
- ubuntu版本信息查看
1.cat /etc/issue 2.cat /etc/lsb-release 3.uname -a 4.cat /proc/version 5.lsb_release -a 显卡信息1.lspci ...
- Mysql(四)-2:多表查询
一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table department( id int, name varchar(20) ); create ta ...
- BLE 5协议栈-通用属性规范层(GATT)
文章转载自:http://www.sunyouqun.com/2017/04/page/2/ 通用属性规范GATT(Generic Attribute Profile)将ATT层定义的属性打包成不同的 ...