当前位置: 首页 > news >正文

dfs深度搜索入门之滑雪

P1434 [SHOI2002] 滑雪 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

本题我们主要使用了深度搜索和记忆化搜所。

首先我们可从任意一点开始滑行,这要求我们每一个点都进行一次深搜。但是如果每个点进行的话肯定会有许多个点重复被寻找最长滑雪长度,怎么办呢?这就轮到记忆化搜所了。我们每找到一个点就把这个点的最长化学长度保存起来。具体原理,我放在代码注释中。

public static int[][] aa;//每个点的高度
public static int bb;
public static int cc;
public static int[][] record;//记录任意一点得到最大化学长度
public static boolean[][] visited;//记录这一点有没有被探索过
public static int[] xx= {-1,1,0,0};///枚举位置
public static int[] yy= {0,0,-1,1};
public static int dfs(int a,int b) {if(visited[a][b]==true) {///如果一个点我们之前已经搜索过了直接返回这个点的最大滑雪长度return record[a][b];}int answer=0;record[a][b]=1;//若这个点没被探索过,我们先把其赋值为1因为任意一点滑雪长度至少是他自己就是1visited[a][b]=true;//接下来开始搜索这个点,先提前标记为·1int c;for(c=0;c<4;c++) {//往这个点的四个方位搜索int x=xx[c]+a;int y=yy[c]+b;if(x<0||x>=bb||y<0||y>=cc) {continue;}if(aa[a][b]>aa[x][y]) {//找到这四个方位最大长度answer=Math.max(answer, dfs(x, y));}}record[a][b]= record[a][b]+answer;加上去return record[a][b];
}}

完整代码:


import java.awt.FontFormatException;
import java.io.BufferedReader; 
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.AnnotatedWildcardType;
import java.math.BigInteger;
import java.net.DatagramPacket;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Spliterator.OfPrimitive;
import java.util.function.IntToDoubleFunction;
import java.util.function.LongBinaryOperator;
import java.util.TreeMap;
import java.util.TreeSet;
import javax.management.relation.InvalidRelationTypeException;
import javax.print.attribute.standard.JobMessageFromOperator;
import javax.print.attribute.standard.JobPriority;
import javax.swing.plaf.ColorChooserUI;
import javax.swing.table.TableModel;
import javax.swing.text.TabSet;
import javax.xml.crypto.dsig.spec.DigestMethodParameterSpec;
public class Main {public static void main(String[] args) throws IOException  {
Scanner sc=new Scanner(System.in);
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw1=new PrintWriter(System.out);
String[] aStrings=br1.readLine().split(" ");
bb=Integer.parseInt(aStrings[0]);
cc=Integer.parseInt(aStrings[1]);
aa=new int[bb+1][cc+1];
record=new int[bb+1][cc+1];
visited=new boolean[bb+1][cc+1];
int a,b;
for(a=0;a<bb;a++) {String[] bStrings=br1.readLine().split(" ");for(b=0;b<cc;b++) {aa[a][b]=Integer.parseInt(bStrings[b]);}
}
int ans=0;for(a=0;a<bb;a++) {for(b=0;b<cc;b++) {ans=Math.max(ans, dfs(a, b));}
}
System.out.println(ans);
}
public static int[][] aa;
public static int bb;
public static int cc;
public static int[][] record;
public static boolean[][] visited;
public static int[] xx= {-1,1,0,0};
public static int[] yy= {0,0,-1,1};
public static int dfs(int a,int b) {if(visited[a][b]==true) {return record[a][b];}int answer=0;record[a][b]=1;visited[a][b]=true;int c;for(c=0;c<4;c++) {int x=xx[c]+a;int y=yy[c]+b;if(x<0||x>=bb||y<0||y>=cc) {continue;}if(aa[a][b]>aa[x][y]) {answer=Math.max(answer, dfs(x, y));}}record[a][b]= record[a][b]+answer;return record[a][b];
}}

http://www.lryc.cn/news/126984.html

相关文章:

  • Python程序设计——元组、集合和字典
  • 八股文之框架篇(Spring Boot、SSM)
  • [PaddlePaddle] [学习笔记] [上] 计算机视觉(卷积、卷积核、卷积计算、padding计算、BN、缩放、平移、Dropout)
  • 【JS 贪心算法常见步骤】
  • 应用案例|基于三维机器视觉的机器人纸箱拆码垛应用解决方案
  • 【ARM 嵌入式 编译 Makefile 系列 10 - Makefile sort 函数详细介绍】
  • Flask下载文件报错304 NOT MODIFIED
  • AI Chat 设计模式:15. 桥接模式
  • Python批量替换Excel和Word中的关键字
  • Codeforces算法心得——A. Array Coloring
  • 论文阅读:《Waymo Public Road Safety Performance Data》
  • url中的特殊符号及特殊字符编码对照表
  • 【C++】详解用标准库的std::mt19937生成随机数
  • 科大讯飞发布星火认知大模型2.0版——体验实测
  • 部署mysql到win10电脑上
  • nginx+php 出现502 bad gateway
  • 基于LVQ神经网络的人脸朝向识别
  • Leetcode Top 100 Liked Questions(序号53~74)
  • Rabbitmq消息不丢失
  • Kotlin runBlocking launch多个协程读写mutableListOf时序
  • Spring Cloud微服务治理框架深度解析
  • 设计模式之原型模式Prototype的C++实现
  • Java 中操作 Redis
  • 数据结构--最短路径 Dijkstra算法
  • 在 Linux 虚拟机上使用 Azure 自定义脚本扩展版本
  • W5500-EVB-PICO 做UDP Server进行数据回环测试(七)
  • ES搜索引擎入门+最佳实践(九):项目实战(二)--elasticsearch java api 进行数据增删改查
  • android内存分析工具记录,请利用好最后2个神器
  • 安科瑞变电所运维平台在电力系统中应用分析
  • uniapp开发微信小程序使用painter将页面转换为图片并保存到本地相册