算法思想之深度優先搜索(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.pswp.cn/pingmian/79644.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79644.shtml
英文地址,請注明出處:http://en.pswp.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…