[agc004e]Salvage Robots dp
Description
蛤蟆国的领土我们可以抽象为H*W的笼子,在这片蛤土上,有若干个机器人和一个出口,其余都是空地,每次蛤蟆会要求让所有的机器人向某个方向移动一步,当机器人移动到出口时会被蛤蟆活摘出来,当机器人移出笼子时会自焚,求你最多取出的多少个机器人。
Input
第一行两个整数H,W,如题目所述
接下来H行,每行W个字符,包含三类字符:
第一类是'.'表示空地
第二类是'o'表示有一个机器人
第三类是'E'表示有一个出口,出口有且仅有一个
Output
一行,活摘的机器人个数
Sample Input
3 3
o.o
.Eo
ooo
Sample Output
3
HINT
H,W≤100
补充样例:
3 4
o...
o...
oooE
输出:5
5 11
ooo.ooo.ooo
o.o.o...o..
ooo.oE..o..
o.o.o.o.o..
o.o.ooo.ooo
输出:12
Sol
首先转化成矩形和格子走。
我们设\(f[i][j][k][l]\)表示起点向左最远走过i步,向右最远走过j步,向上最远走过k步,向下最远走过l步能够最大覆盖的机器人数量。
那么我们转移的时候去掉已经出格的,加上转移的时候新增的量即可(一定是一个连续的序列,所以可以用前缀和预处理)。
注意细节边界问题非常多。
开short,否则爆空间。
Code
#include<bits/stdc++.h>
using namespace std;
short f[102][102][102][102],s1[102][102],s2[102][102],ans;int n,m,x,y;char c[102][102];
int main()
{
scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%s",c[i]+1);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(c[i][j]=='E') x=i,y=j;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) s1[i][j]=s1[i][j-1]+(c[i][j]=='o'),s2[i][j]=s2[i-1][j]+(c[i][j]=='o');
for(int a=0;a<x;a++) for(int b=0;b<=n-x;b++) for(int c=0;c<y;c++) for(int d=0;d<=m-y;d++)
{
int U=b+1,D=n-a,L=d+1,R=m-c;ans=max(ans,f[a][b][c][d]);
if(U<x-a) f[a+1][b][c][d]=max((int)f[a+1][b][c][d],f[a][b][c][d]+s1[x-a-1][min(R,y+d)]-s1[x-a-1][max(L,y-c)-1]);
if(x+b<D) f[a][b+1][c][d]=max((int)f[a][b+1][c][d],f[a][b][c][d]+s1[x+b+1][min(R,y+d)]-s1[x+b+1][max(L,y-c)-1]);
if(L<y-c) f[a][b][c+1][d]=max((int)f[a][b][c+1][d],f[a][b][c][d]+s2[min(D,x+b)][y-c-1]-s2[max(U,x-a)-1][y-c-1]);
if(y+d<R) f[a][b][c][d+1]=max((int)f[a][b][c][d+1],f[a][b][c][d]+s2[min(D,x+b)][y+d+1]-s2[max(U,x-a)-1][y+d+1]);
}
printf("%d\n",ans);
}
[agc004e]Salvage Robots dp的更多相关文章
- AtCoder AGC004E Salvage Robots (DP)
题目链接 https://atcoder.jp/contests/agc004/tasks/agc004_e 题解 本题的难度不在于想到大体思路,而在于如何把代码写对.. 首先我们可以不让机器人动,让 ...
- [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 ...
- ABC 158 F - Removing Robots dp 单调栈
LINK:Removing Robots 没想到 自闭. 考虑了一个容斥 发现不合法方案难以计算. 就算可以计算也几乎是n^2的做法. 考虑dp 左边会对右边产生影响 所以考虑先dp右边的再考虑左边的 ...
- AT2045 Salvage Robots
传送门 这个题只要想到移动机器人和移动出口是等价的就好做了 考虑设\(f[i][j][k][t]\)为最远向左移动\(i\),向右移动\(j\),向上移动\(k\),向下移动\(t\),这个矩形内最多 ...
- Solution -「AGC 004E」「AT 2045」Salvage Robots
\(\mathcal{Description}\) Link. 有一个 \(n\times m\) 的网格.每个格子要么是空的,要么有一个机器人,要么是一个出口(仅有一个).每次可以命令所有机 ...
- 多校联训 DP 专题
[UR #20]跳蚤电话 将加边变为加点,方案数为 \((n-1)!\) 除以一个数,\(dp\) 每种方案要除的数之和即可. 点击查看代码 #include<bits/stdc++.h> ...
随机推荐
- java基础之日期时间工具类
package zy.test; import java.sql.Timestamp; import java.text.ParseException; import java.text.ParseP ...
- Invoke and BeginInvoke(转载:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html)
一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己. 1 ...
- 测试URL
http://localhost:8080/dmonitor-webapi/monitor/vm/342?r=1410331220921&indexes=cpu&indexes=mem ...
- activeMQ集群搭建及高可用
三台服务器搭建如下的集群,达到了高可用.也同时达到了负载的目的: /****************************************************************** ...
- SpringBoot自定义拦截器实现
1.编写拦截器实现类,此类必须实现接口 HandlerInterceptor,然后重写里面需要的三个比较常用的方法,实现自己的业务逻辑代码 如:OneInterceptor package com ...
- c语言和设计模式
在网上看到一个博客专门写了关于设计模式的文章,感觉很有用.其实,我感觉数据结构 算法 设计模式 这三样同等重要啊. 数据结构 算法相对而言接触的比较多,但设计模式这个东西真的一头雾水,有时候觉得别人写 ...
- Go 语言并发笔记
前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...
- 3.3.6-1 ArrayBlockingQueue简单分析
构造方法:public ArrayBlockingQueue(int capacity) { this(capacity, false); } public ArrayBlockingQueue(in ...
- js总结33 :javascript-DOM节点属性
1 设置节点属性三个方法: 获取:getAttribute(名称) 设置:setAttribute(名称, 值) 删除:removeAttribute(名称) 举个例子: <!DOCTYPE h ...
- java IO类简单介绍
一.流的概念 流是字节序列的抽象概念.流和文件的差别:文件是数据的静态存储形式,而流是指数据传输时的形态.文件只是流的操作对象之一.流按其操作的对象不同可以分为文件流.网络流.内存流.磁带流等.Jav ...