题目传送门

记忆化搜索

首先,这题 \(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 及相关的更多相关文章

  1. java学习笔记——基于Robot类的屏幕分享

    直接上代码,具体看注释: package robot; import java.awt.AWTException; import java.awt.Dimension; import java.awt ...

  2. TensorFlow学习笔记(七)Tesnor Board

    为了更好的管理.调试和优化神经网络的训练过程,TensorFlow提供了一个可视化工具TensorBoard.TensorBoard可以有效的展示TensorFlow在运行过程中的计算图..各种指标随 ...

  3. WinPhone学习笔记(一)——页面导航与页面相关

    最近学一下Windows Phone(接下来简称“WinPhone”)的开发,在很久很久前稍探究一下WinPhone中对一些传感器的开发,那么现在就从头来学学WinPhone的开发.先从WinPhon ...

  4. .net学习笔记----利用System.Drawing.Image类进行图片相关操作

    C#中对图片的操作主要是通过System.Drawing.Image等类进行. 一.将图片转换为字节流 /// <summary> /// 图片处理帮助类 /// </summary ...

  5. HTML笔记(五)表单<form>及其相关元素

    表单标签<form> 表单是一个包含表单元素的区域. 表单元素是允许用户在表单中输入信息的元素. 输入标签<input> 输入标签的输入类型由其类型属性type决定.常见的输入 ...

  6. 【Hadoop代码笔记】Hadoop作业提交之JobTracker等相关功能模块初始化

    一.概要描述 本文重点描述在JobTracker一端接收作业.调度作业等几个模块的初始化工作.想过模块的介绍会在其他文章中比较详细的描述.受理作业提交在下一篇文章中会进行描述. 为了表达的尽可能清晰一 ...

  7. 数据挖掘学习笔记:挖掘频繁模式、关联和相关[ZZ]

    所 谓挖掘频繁模式,关联和相关,即指在出现的数据集中找到一个经常出现的序列模式或者是一个经常出现的数据结构.就像搞CPU设计的人知道,Cache的预 取机制有流预取和指针预取,前者就是发现流模式,即发 ...

  8. 学习笔记 css3--选择器&新增颜色模式&文本相关

    Css3 选择器 --属性选择器 E[attr]只使用属性名,但没有确定任何属性值,E[attr="value"]指定属性名,并指定了该属性的属性值E[attr~="va ...

  9. 前端学习笔记(zepto或jquery)——对li标签的相关操作(五)

    对li标签的相关操作——has与find的差异性 demo代码: <ul> <li><p>1</p></li> <li>2< ...

随机推荐

  1. [CISCN2019 华北赛区 Day1 Web2]ikun-1|python反序列化

    考点:JWT身份伪造.python pickle反序列化.逻辑漏洞 1.打开之后首页界面直接看到了提示信息,信息如下: 2.那就随便注册一个账号进行登录,然后购买lv6,但是未发现lv6,那就查看下一 ...

  2. awk5个使用场景

    awk简介 首先要知道awk的使用场景,需了解awk有哪些优势与短板. 关于个人近期学习awk总结其优势: awk对文本的处理运算效率同比其他工具效率高很多(比shell的for循环高10倍以上,运算 ...

  3. 【题解笔记】PTA基础6-10:阶乘计算升级版

    题目地址:https://pintia.cn/problem-sets/14/problems/742 前言 咱目前还只能说是个小白,写题解是为了后面自己能够回顾.如果有哪些写错的/能优化的地方,也请 ...

  4. 如何从零开始参与 Apache 顶级开源项目?| 墙裂推荐

    ​ 写在开头 从 2021 开始,有一个很有意思的说法经常在各大技术媒体或开源论坛中出现,「开源正在吞噬一切」.不论是否言过其实,从一个行业从业者的切身感知来看,开源确实从少数极客的小众文化成为主流的 ...

  5. KingbaseES V8R6 vacuum index_cleanup 选项

    描述: 由于索引页的复用不像HEAP TABLE的PAGE复用机制那么简单只要有空闲空间就可以插入.索引页的空闲空间被复用,必须是PAGE的边界内的值才允许插入. 因此索引一旦膨胀,很难收缩,常用的方 ...

  6. docker学习笔记一-docker安装与卸载

    环境查看 # 1 查询当前centOS的版本,官方要求版本为7以上 uname -r 查询系统内核 cat /etc/os-release 系统版本 安装 # 1.卸载旧版本 yum remove d ...

  7. JavaScript 的闭包(closure)

    以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/ 对于闭包的理解,其实可以归纳为,在创建函数时,同时创建了一 ...

  8. C++自学笔记 头文件 (header file)关于 #include 和.h

    头文件 在C++中定义Definition一个类的时候 要用分别的.h和.cpp文件去定义这个类 .h和.cpp成对出现 类的声明declaration和函数原型放在头文件里(.h) 定义这些函数的结 ...

  9. 将 N 叉树编码为二叉树

    将 N 叉树编码为二叉树 作者:Grey 原文地址: 博客园:将 N 叉树编码为二叉树 CSDN:将 N 叉树编码为二叉树 题目描述 将一棵n叉树编码为一棵二叉树,并对二叉树进行解码,得到原始的n叉树 ...

  10. MySQL用户也可以是个角色

    前言 角色(Role),可以认为是一些权限的集合,一直是存在各个数据库中,比如Oracle.SQL Server.OceanBase等,MySQL 自从 8.0 release 才引入角色这个概念. ...