【笔记】CF1607F Robot on the Board 2 及相关
题目传送门
记忆化搜索
首先,这题 \(10000\) 组 \(2000\times 2000\) 的数据直接爆搜肯定会超时。想到,如果一个点的答案已经被更新过,之后走到这个点能再多走的点也就确定了,所以考虑记忆化搜索。然后就是分类讨论几种情况了(引用 HDWR 的图片):
- 走出地图边界:

这时候只要从边界开始往回标号即可。所以搜索的时候需要把途经的点都按顺序记录下来。

- 走到已经走过并记下答案路径上:

这种情况和走到边界很像,只要从碰到的那个点开始往回标号即可。

- 走到了本次搜索到的路径上,也就是出现了环:

这时,环上的每一个点都可以走遍环上路径,所以标记答案为环的长度。剩下的部分是走向环的,所以从与环接触的点开始,依次往回标号即可。

然后只要对每一个点 \(dfs\) 一遍,找出最大的答案即可。
因为 \(\sum n\times m\le 4\times 10^6\),每个点只会被搜到一次,所以复杂度正确。
细节
首先,\(\huge{\texttt多组数据\ !}\)
多测不清空, WA 两行泪。特别注意,是搜到边界外面时开始更新答案的,所以边界外面一圈也会有答案,清空的时候要大一圈!
其次,直接写深搜,这种做法会爆栈,MLE on #4 。
考虑到本题情况,不需要回溯,所以其实不用深搜,只要用 \(while(1)\),每次在循环内改位置、编号即可。
Code
#include<bits/stdc++.h>
using namespace std;
int T,n,m,a[2005][2005],ans[2005][2005];
int cnth,ansn,ansx,ansy;
bool vis[2005][2005];
char c;
struct node{
int x,y;
}q[4000005];
int turn(char c){
if(c=='L') return 1;
if(c=='R') return 2;
if(c=='U') return 3;
if(c=='D') return 4;
}
void init(){ //初始化
for(int i=0;i<=n+1;i++){
for(int j=0;j<=m+1;j++) ans[i][j]=vis[i][j]=0;
}
ansn=0;
}
void dfs(int x,int y,int k){
while(1){
if(x<1||y<1||x>n||y>m||ans[x][y]){ //走出边界或已经走到过
for(int i=1;i<k;i++) ans[q[i].x][q[i].y]=ans[x][y]+k-i;
return ;
}
if(vis[x][y]){ //出现环
cnth=0;
for(int i=1;i<k;i++){ //算不在环上的大小
if(x==q[i].x&&y==q[i].y) cnth=i;
}
for(int i=1;i<cnth;i++) ans[q[i].x][q[i].y]=k-i; //更新不在环上的答案
for(int i=cnth;i<k;i++) ans[q[i].x][q[i].y]=k-cnth; //更新环上答案
return ;
}
vis[x][y]=1,q[k].x=x,q[k].y=y,k++; //记录下当前状态并走向下一个状态
if(a[x][y]==1) y--;
else if(a[x][y]==2) y++;
else if(a[x][y]==3) x--;
else if(a[x][y]==4) x++;
}
}
void print(){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(ans[i][j]>ansn){
ansn=ans[i][j];
ansx=i,ansy=j;
}
}
}
printf("%d %d %d\n",ansx,ansy,ansn);
}
void solve(){
scanf("%d%d",&n,&m);
scanf("%c",&c);
for(int i=1;i<=n;i++){
for(int j=1;j<=m+1;j++){
scanf("%c",&c);
a[i][j]=turn(c);
}
}
init();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) dfs(i,j,1);
}
print();
}
int main(){
scanf("%d",&T);
while(T--) solve();
return 0;
}
【笔记】CF1607F Robot on the Board 2 及相关的更多相关文章
- java学习笔记——基于Robot类的屏幕分享
直接上代码,具体看注释: package robot; import java.awt.AWTException; import java.awt.Dimension; import java.awt ...
- TensorFlow学习笔记(七)Tesnor Board
为了更好的管理.调试和优化神经网络的训练过程,TensorFlow提供了一个可视化工具TensorBoard.TensorBoard可以有效的展示TensorFlow在运行过程中的计算图..各种指标随 ...
- WinPhone学习笔记(一)——页面导航与页面相关
最近学一下Windows Phone(接下来简称“WinPhone”)的开发,在很久很久前稍探究一下WinPhone中对一些传感器的开发,那么现在就从头来学学WinPhone的开发.先从WinPhon ...
- .net学习笔记----利用System.Drawing.Image类进行图片相关操作
C#中对图片的操作主要是通过System.Drawing.Image等类进行. 一.将图片转换为字节流 /// <summary> /// 图片处理帮助类 /// </summary ...
- HTML笔记(五)表单<form>及其相关元素
表单标签<form> 表单是一个包含表单元素的区域. 表单元素是允许用户在表单中输入信息的元素. 输入标签<input> 输入标签的输入类型由其类型属性type决定.常见的输入 ...
- 【Hadoop代码笔记】Hadoop作业提交之JobTracker等相关功能模块初始化
一.概要描述 本文重点描述在JobTracker一端接收作业.调度作业等几个模块的初始化工作.想过模块的介绍会在其他文章中比较详细的描述.受理作业提交在下一篇文章中会进行描述. 为了表达的尽可能清晰一 ...
- 数据挖掘学习笔记:挖掘频繁模式、关联和相关[ZZ]
所 谓挖掘频繁模式,关联和相关,即指在出现的数据集中找到一个经常出现的序列模式或者是一个经常出现的数据结构.就像搞CPU设计的人知道,Cache的预 取机制有流预取和指针预取,前者就是发现流模式,即发 ...
- 学习笔记 css3--选择器&新增颜色模式&文本相关
Css3 选择器 --属性选择器 E[attr]只使用属性名,但没有确定任何属性值,E[attr="value"]指定属性名,并指定了该属性的属性值E[attr~="va ...
- 前端学习笔记(zepto或jquery)——对li标签的相关操作(五)
对li标签的相关操作——has与find的差异性 demo代码: <ul> <li><p>1</p></li> <li>2< ...
随机推荐
- javaweb-thymeleaf,加载jar包---视图基础
1.加载完thymeleaf的jar包 将thymeleaf的jar包复制到项目下lib文件夹中 右击lib文件夹,点击Add as librarb... 打开Project Structure,找到 ...
- NSK DD马达 直驱电机 RS232通信连接
NSK DD马达 通信连接 通信测试平台 驱动器:NSK EDC系列 电机:NSK PS1006KN系列 电机线:UVW对应红白黑. 电源线:Main和Ctrl电路220V交流电供电即可. 测试软件: ...
- QtCreator像C# region一样折叠代码
C# #region "comment" [code] #endregion 就可以在VS中实现代码折叠了 QtCreator #pragma region "comme ...
- Docker实用篇
Docker实用篇 0.学习目标 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦. 分布式系统中,依赖的组件非常多,不同组件之间 ...
- 使用 Mypy 检查 30 万行 Python 代码,总结出 3 大痛点与 6 个技巧!
作者:Charlie Marsh 译者:豌豆花下猫@Python猫 英文:Using Mypy in production at Spring (https://notes.crmarsh.com/u ...
- Typora自动上传超级详细教程!!
第一步检查环境变量 打开cmd 查看以下环境变量 需要软件: Typora PicGo gitee账号 配置node 配置git 第二步创建gitee仓库 设置仓库名直接创建,因为这里不能直接修改开源 ...
- 采云端&采云链:从订单协同到采购供应链,让采购供应链互联互通
采购供应链安全从来没有像现在这样显得如此重要和紧迫,也从来没有像现在这样复杂和敏感,对企业的经营产生决定性的影响.尤其在疫情期间,采购供应链更加牵一发而动全身,成为"运筹帷幄,决胜于千里之外 ...
- vue开发组件开发中的小技巧
声明:以下随笔由博主自主编写,也有部分引用网友的,引用部分版权归原作者所有,其他博主原创部分禁止转载.复制全部或部分用以重新发布! vue递归组件事件阻止冒泡 其实这里主要还有递归组件的自定义事件不生 ...
- 干货分享|使用 Istio 实现灰度发布
Kubernetes 作为基础平台,提供了强大的容器编排能力.但是在其上部署业务和服务治理上,仍然会面对一些复杂性和局限性.在服务治理上,已经有许多成熟的 ServiceMesh 框架用于扩充其能力, ...
- 01 uniapp/微信小程序 项目day01
一.起步 1.1 配置uni-app开发环境 什么是uni-app,就是基于vue的一个开发框架,可以将我们写的一套代码,同时发布到ios.安卓.小程序等多个平台 官方推荐使用Hbuilderx来写u ...