算法思想之深度优先搜索(DFS)、递归以及案例(最多能得到多少克黄金、精准核酸检测、最富裕的小家庭)

深度优先搜索(DFS)、递归

  • 深度优先搜索(Depth First Search,DFS)是一种用于遍历或搜索树或图的算法。在 DFS 算法中,从起始节点开始,沿着一条路径尽可能深地访问节点,直到到达叶子节点或者无法继续前进为止。然后退回到最近的一个有未探索节点的分支节点,继续探索其他路径,直到所有节点都被访问过为止。

  • 深度优先搜索常常用于解决以下类型的问题:

    • 图遍历:在无向图或有向图中寻找特定节点之间的路径、判断图的连通性等。
    • 连通性问题:判断图中是否存在环、判断图的强连通分量等。
    • 组合问题:生成排列、组合或子集等组合型问题。
    • 寻路问题:求解从起始点到目标点的最短路径或所有可行路径。
    • 递归问题:通过递归实现深度优先搜索,例如二叉树的遍历等。

    深度优先搜索是一种简单而强大的算法,可以解决许多实际问题。


小华最多能得到多少克黄金

  • 题目描述

    小华按照地图去寻宝,地图上被划分成 m 行和 n 列的方格,横纵坐标范围分别是 [0, n-1] 和 [0, m-1]。

    在横坐标和纵坐标的数位之和不大于 k 的方格中存在黄金(每个方格中仅存在一克黄金),但横坐标和纵坐标之和大于 k 的方格存在危险不可进入。小华从入口 (0,0) 进入,任何时候只能向左,右,上,下四个方向移动一格。

    请问小华最多能获得多少克黄金?

    输入要求

    坐标取值范围如下:

    • 0 ≤ m ≤ 50
    • 0 ≤ n ≤ 50

    k 的取值范围如下:

    • 0 ≤ k ≤ 100

    输入中包含3个字数,分别是m, n, k

    输出要求

    输出小华最多能获得多少克黄金

  • 用例1

    输入:
    40 40 18
    输出:1484
    

    用例2

    输入:
    5 4 7
    输出:20
    
  • 题解

    数位之和是指一个数的各个位上数字的和。

    • 例如,对于数字1234,它的各个位上的数字分别是1、2、3和4,那么它的数位之和就等于1+2+3+4=10。

      同样地,对于数字56789,它的数位之和就等于5+6+7+8+9=35。

    • 在题目中,提到横纵坐标的数位之和不大于k,意味着将横坐标和纵坐标的每个位上的数字相加,得到的和要小于或等于k。

    这道题可以使用深度优先搜索(DFS)算法来解决。

    1. 首先,可以定义一个函数 dfs 来进行深度优先搜索。这个函数可以接受当前位置的坐标 (x, y)、当前黄金数量 gold 和已经访问过的方格集合 visited 作为参数。
    2. 在 dfs 函数中,首先判断当前位置是否越界或者已经访问过,如果是则直接返回。然后判断当前位置的横纵坐标的数位之和是否大于 k,如果是则说明是危险方格,也直接返回。否则,将当前位置标记为已访问,并将当前位置的黄金数量加上当前方格的黄金数量。
    3. 接下来,递归地调用 dfs 函数来搜索当前位置的上、下、左、右四个方向的相邻方格。对于每个相邻方格,传入更新后的坐标和黄金数量,并将得到的结果取最大值。
    4. 最后,在主函数中,从入口位置 (0, 0) 开始调用 dfs 函数,并输出返回的最大黄金数量。
    import java.util.*;
    public class Main {static int m, n, k;static int[] xArr = {-1, 1, 0, 0}, yArr = {0, 0, 1, -1};public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {m = sc.nextInt(); n = sc.nextInt(); k = sc.nextInt();System.out.println(move(0, 0, 0, new HashSet<>()));}}public static int move(int x, int y, int ret, Set<String> visited) {if (x < 0 || x > n - 1 || y < 0 || y > m -1 || visited.contains(x + "," + y)|| calculate(x) + calculate(y) > k)return ret;ret++;visited.add(x + "," + y);for (int i = 0; i < 4; i++)ret = Math.max(ret, move(x + xArr[i], y + yArr[i], ret, visited));return ret;}public static int calculate(int n) {int ret = 0;while (n % 10 > 0) {ret += n % 10;n /= 10;}return ret;}
    }
    

精准核酸检测

  • 题目描述

    为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群。

    现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹交叉。

    现在给定一组确诊人员编号(X1, X2, X3,…, Xn),在所有人当中,找出哪些人需要进行核酸检测,输出需要进行核酸检测的人数。(注意:确诊病例自身不需要再做核酸检测)

    需要进行核酸检测的人,是病毒传播链条上的所有人员,即有可能通过确诊病例所能传播到的所有人。

    例如:A 是确诊病例,A 和 B 有接触、B 和 C 有接触、C 和 D 有接触、D 和 E 有接触,那么 B、C、D、E 都是需要进行核酸检测的人。

    输入要求

    第一行为总人数 N

    第二行为确认病例人员编号(确诊病例人员数量 < N),用逗号分割

    第三行开始,为一个 N * N 的矩阵,表示每个人员之间是否有接触,0 表示没有接触,1 表示有接触。

    输出要求

    整数:需要做核酸检测的人数

    特别说明

    • 人员编号从 0 开始
    • 0 < N < 100
  • 用例1

    输入:
    5
    1,2
    1,1,0,1,0
    1,1,0,0,0
    0,0,1,0,1
    1,0,0,1,0
    0,0,1,0,1
    输出:3
    说明:
    编号为1、2号的人员,为确诊病例。
    1号与0号有接触,0号与3号有接触
    2号与4号有接触
    故0、3、4号共3人需要核酸检测
    
  • 题解

    import java.util.*;
    public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int n = Integer.parseInt(sc.nextLine());int[] arr = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();int[][] arrs = new int[n][n];for (int i = 0; i < n; i++)arrs[i] = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();HashSet<Integer> set = new HashSet<>(); // 存储确诊和需要检测的人for (int i : arr) {set.add(i);reDo(i, arrs, set);}System.out.println(set.size() - arr.length); // 减去确诊人数}}public static void reDo(int i, int[][] arrs, HashSet<Integer> set) {for (int j = 0; j < arrs[i].length; j++) {if (arrs[i][j] == 1 && !set.contains(j)){ // 递归终止条件set.add(j);reDo(j, arrs, set);}}}
    }
    

最富裕的小家庭

  • 题目描述

    在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为一个小家庭。

    现给你一颗树,请计算出最富裕的小家庭的财富和。

    输入要求

    第一行为一个数 N,表示成员总数,成员编号 1~N。1 ≤ N ≤ 1000

    第二行为 N 个空格分隔的数,表示编号 1~N 的成员的财富值。0 ≤ 财富值 ≤ 1000000

    接下来 N -1 行,每行两个空格分隔的整数(N1, N2),表示 N1 是 N2 的父节点。

    输出要求

    最富裕的小家庭的财富和

  • 用例1

    输入:
    4
    100 200 300 500
    1 2
    1 3
    2 4
    输出:700
    说明:成员1,2,3 组成的小家庭财富值为600,成员2,4 组成的小家庭财富值为700
    

    用例2

    输入:
    4
    100 200 300 500
    1 2
    1 3
    1 4
    输出:1100
    说明:成员1,2,3 组成的小家庭财富值为600,成员2,4 组成的小家庭财富值为700
    
  • 题解

    import java.util.*;
    public class Main {-lpublic static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int n = sc.nextInt();int[] arr = new int[n + 1]; // 数组索引从0开始,成员编号从1开始,故n个成员需要n+1大小数组for (int i = 0; i < n; i++) // 成员编号从1开始,以成员编号作为数组索引arr[i + 1] = sc.nextInt();List<List<Integer>> list = new ArrayList<>();for (int i = 0; i <= n; i++) // 集合add从索引0开始,从索引1开始与成员编号对齐list.add(new ArrayList<>());for (int i = 0; i < n - 1; i++)list.get(sc.nextInt()).add(sc.nextInt());int max = 0;for (int i = 1; i <= n; i++) {int sum = arr[i];for (Integer sun : list.get(i)) // 遍历该成员编号的所有直接连接的子节点sum += arr[sun];max = Math.max(max, sum);}System.out.println(max);}}
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark,HDFS客户端操作

hadoop客户端环境准备 找到资料包路径下的Windows依赖文件夹&#xff0c;拷贝hadoop-3.1.0到非中文路径&#xff08;比如d:\hadoop-3.1.0&#xff09; ① 打开环境变量 ② 在下方系统变量中新建HADOOP_HOME环境变量,值就是保存hadoop的目录。 效果如下&#xff1a; ③ 配置Pa…

共享会议室|物联网解决方案:打造高效、智能的会议空间!

在数字化转型的浪潮下&#xff0c;企业、园区、公共机构的会议室面临诸多痛点&#xff0c;如何通过物联网技术实现会议室资源的智能调度、环境设备的自动化控制以及用户体验的全面升级&#xff1f;本文将结合行业实践与技术方案&#xff0c;探讨基于物联网的共享会议室解决方案…

ts bug 找不到模块或相应类型的声明,@符有红色波浪线

解决方法&#xff1a;在env.d.ts文件中添加以下代码&#xff0c;这段代码是一个 TypeScript 的声明文件&#xff0c;用于让 TypeScript 知道如何处理 Vue 单文件组件&#xff08;.vue 文件&#xff09;的导入。 /// <reference types"vite/client" /> // 声明…

端口隔离基本配置

1.top图 2.交换机配置 # sysname sw1 # vlan batch 10 # interface GigabitEthernet0/0/1port link-type trunkport trunk allow-pass vlan 10 # interface GigabitEthernet0/0/2port link-type trunkport trunk allow-pass vlan 10sys sw2 # vlan batch 10 # interface Giga…

Android View#post()源码分析

文章目录 Android View#post()源码分析概述onCreate和onResume不能获取View的宽高post可以获取View的宽高总结 Android View#post()源码分析 概述 在 Activity 中&#xff0c;在 onCreate() 和 onResume() 中是无法获取 View 的宽高&#xff0c;可以通过 View#post() 获取 Vi…

SecureCrt设置显示区域横列数

1. Logical rows //逻辑行调显示区域高度的 一般超过50就全屏了 2. Logical columns //逻辑列调显示区域宽度的 3. Scrollback buffer //缓冲区大小

最短路径-Dijkstra算法板子(java)

自己把Dijkstra的板子整理了一下&#xff0c;也方便自己后续做题&#xff0c;在此做个记录。 Dijkstra基本上都会需要这些变量&#xff1a; dist[]&#xff1a;记录各个节点到起始节点的最短权值 path[]&#xff1a;记录各个节点的上一个节点(用来联系该节点到起始节点的路径)…

PostgreSQL数据库的array类型

PostgreSQL数据库相比其它数据库&#xff0c;有很多独有的字段类型。 比如array类型&#xff0c;以下表的pay_by_quarter与schedule两个字段便是array类型&#xff0c;即数组类型。 CREATE TABLE sal_emp (name text,pay_by_quarter integer[],schedule t…

centos的根目录占了大量空间怎么办

问题 当根目录磁盘不够时&#xff0c;就必须删除无用的文件了 上面的&#xff0c;如果删除/usr 或/var是可以释放出系统盘的 定位占空间大的文件 经过命令&#xff0c;一层层查哪些是占磁盘的。 du -sh /* | sort -rh | head -n 10 最终排查&#xff0c;是有个系统日志占了20…

PostgreSQL存储过程“多态“实现:同一方法名支持不同参数

引言 在传统编程语言中&#xff0c;方法重载&#xff08;同一方法名不同参数&#xff09;是实现多态的重要手段。但当我们将目光转向PostgreSQL数据库时&#xff0c;是否也能在存储过程&#xff08;函数&#xff09;中实现类似的功能&#xff1f;本文将深入探讨PostgreSQL中如…

快速学会Linux的WEB服务

一.用户常用关于WEB的信息 什么是WWW www是world wide web的缩写&#xff0c;及万维网&#xff0c;也就是全球信息广播的意思 通常说的上网就是使用www来查询用户所需要的信息。 www可以结合文字、图形、影像以及声音等多媒体&#xff0c;超链接的方式将信息以Internet传递到世…

Windows玩游戏的时候,一按字符键就显示桌面

最近打赛伯朋克 2077 的时候&#xff0c;不小心按错键了&#xff0c;导致一按字符键就显示桌面。如下&#xff1a; 一开始我以为是输入法的问题&#xff08;相信打游戏的人都知道输入法和奔跑键冲突的时候有多烦&#xff09;&#xff0c;但是后来解决半天发现并不是。在网上搜…

【测试开发】概念篇 - 从理解需求到认识常见开发、测试模型

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

核函数(Kernel function)

核函数 核函数在GPU上进行并行执行 注意: 限定词__global__修饰 [双下划线]返回值必须是void 形式: _global_ void kernel_function( argument arg){ ​ printf(“hello world from the GPU\n”); } void __global__kernel_function( argument arg){ ​ printf(“hello worl…

数据结构与算法:区间dp

前言 区间dp也是动态规划里很重要的一部分。 一、内容 区间dp的根本原理就是把大范围问题分解成若干小范围的问题去求解。一般来讲,常见的用法有对于两侧端点去展开可能性和对于范围上的划分点去展开可能性。 二、题目 1.让字符串成为回文串的最少插入次数 class Soluti…

AI Agent 入门指南:从 LLM 到智能体

AI. AI. AI. 最近耳朵里是不是总是被这些词轰炸&#xff1f;特别是“Agent”、“AI Agent”、“智能体”、“Agentic”…… 感觉一夜之间&#xff0c;AI 就从我们熟悉的聊天框里蹦出来&#xff0c;要拥有“独立思考”和“自主行动”的能力了&#xff1f; 说实话&#xff0c;一…

开启docker中mysql的binlog日志

1.登陆docker服务器,输入docker ps查看服务: 2.进入mysql服务 进入到mysql的服务容器后,输入mysql -u*** -p***登陆 mysql 客户端查看是否开启binlog 输入 : show variables like log_bin; 3.输入quit退出mysql客户端 4.之后在docker的mysql服务容器里查询mysql的配置文件所在…

Kotlin 中 List 和 MutableList 的区别

在 Kotlin 中&#xff0c;List 和 MutableList 是两种不同的集合接口&#xff0c;核心区别在于可变性。 Kotlin 集合框架的重要设计原则&#xff1a;通过接口分离只读&#xff08;read - only&#xff09;和可变&#xff08;mutable&#xff09;操作&#xff0c;以提高代码的安…

【能力比对】K8S数据平台VS数据平台

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨AllData数据中台官方平台&…

Fastjson 从多层级的JSON数据中获取特定字段的值

使用 Fastjson 的 JSONPath.eval 可以通过 JSONPath 表达式直接定位多层级 JSON 中的目标字段&#xff0c;避免逐层调用 getJSONObject() 的繁琐操作。以下是具体实现方法和示例&#xff1a; 核心思路 通过 JSONPath.eval 方法&#xff0c;传入 JSON 对象&#xff08;或 JSON…