藍橋杯 Java B 組之記憶化搜索(滑雪問題、斐波那契數列)

Day 5:記憶化搜索(滑雪問題、斐波那契數列)


📖 一、記憶化搜索簡介

記憶化搜索(Memoization) 是一種優化遞歸的方法,它利用 哈希表(HashMap)或數組 存儲已經計算過的結果,避免重復計算,提高效率。

📌 記憶化搜索 vs 動態規劃

方法特點適用場景
記憶化搜索自頂向下(遞歸 + 記憶化存儲)遞歸問題
動態規劃自底向上(迭代 + 狀態轉移)適用于所有 DP 問題

📖 二、經典記憶化搜索問題

1. 滑雪問題

題目描述

  • 給定一個 n × m 的矩陣,每個位置 (i, j) 代表海拔高度 h(i, j)
  • 從某一點 (i, j) 出發,可以向 上下左右 移動,前提是新的位置海拔嚴格低于當前點。
  • 目標是求最長的滑雪路徑長度

🔹 1. 思路

  • 遞歸搜索所有可能的路徑。
  • 由于路徑可能會重復訪問同一個點,我們用 dp[i][j] 記憶化存儲 (i, j) 位置的最長滑雪路徑

🔹 2. 代碼實現(滑雪問題)

import java.util.*;public class Skiing {static int[][] directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};static int[][] grid, dp;static int rows, cols;public static int longestSkiPath(int[][] matrix) {if (matrix == null || matrix.length == 0) return 0;rows = matrix.length;cols = matrix[0].length;grid = matrix;dp = new int[rows][cols];int maxPath = 0;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {maxPath = Math.max(maxPath, dfs(i, j));}}return maxPath;}private static int dfs(int i, int j) {if (dp[i][j] != 0) return dp[i][j]; // 記憶化:避免重復計算int maxLength = 1; // 初始長度for (int[] dir : directions) {int x = i + dir[0], y = j + dir[1];if (x >= 0 && x < rows && y >= 0 && y < cols && grid[x][y] < grid[i][j]) {maxLength = Math.max(maxLength, 1 + dfs(x, y));}}dp[i][j] = maxLength;return maxLength;}public static void main(String[] args) {int[][] matrix = {{9, 8, 7},{6, 5, 4},{3, 2, 1}};System.out.println("最長滑雪路徑長度: " + longestSkiPath(matrix)); // 輸出 9}
}

🔹 3. 代碼講解

  1. dfs(i, j) 遞歸查找 (i, j) 位置的最長路徑。
  2. dp[i][j] 記憶化存儲 計算過的路徑,避免重復計算。
  3. 四個方向搜索,如果高度下降,則遞歸搜索。

? 時間復雜度:O(n × m)(避免重復計算)。


📖 三、斐波那契數列(Fibonacci)

題目描述: 斐波那契數列定義如下:

F(n)=F(n?1)+F(n?2),F(0)=0,F(1)=1F(n) = F(n-1) + F(n-2), \quad F(0) = 0, \quad F(1) = 1

F(n)


🔹 1. 代碼實現(記憶化搜索版)

import java.util.*;public class FibonacciMemoization {static Map<Integer, Long> memo = new HashMap<>();public static long fibonacci(int n) {if (n == 0) return 0;if (n == 1) return 1;if (memo.containsKey(n)) return memo.get(n);long result = fibonacci(n - 1) + fibonacci(n - 2);memo.put(n, result);return result;}public static void main(String[] args) {System.out.println("Fibonacci(50): " + fibonacci(50)); // 輸出很快}
}

? 時間復雜度:O(n),避免 O(2^n) 的指數級遞歸。


📖 四、藍橋杯真題:2021省賽 - 冰雹數

題目描述: 冰雹數列定義如下:

  • Hail(n) = n / 2(如果 n 是偶數)。
  • Hail(n) = 3n + 1(如果 n 是奇數)。
  • 繼續計算直到 n = 1,求 Hail(n) 的長度。

示例

輸入: 10
輸出: 7

🔹 1. 代碼實現(記憶化搜索)

import java.util.*;public class HailstoneSequence {static Map<Integer, Integer> memo = new HashMap<>();public static int hailstoneLength(int n) {if (n == 1) return 1;if (memo.containsKey(n)) return memo.get(n);int next = (n % 2 == 0) ? n / 2 : 3 * n + 1;int length = 1 + hailstoneLength(next);memo.put(n, length);return length;}public static void main(String[] args) {int n = 10;System.out.println("冰雹數列長度: " + hailstoneLength(n)); // 輸出 7}
}

🔹 2. 代碼講解

  1. hailstoneLength(n) 遞歸計算 n 的冰雹序列長度。
  2. memo 記憶化存儲 已計算的 n,避免重復計算。

? 時間復雜度:O(n),避免 O(2^n) 級別的計算。


📖 五、總結

1. 記憶化搜索 vs 動態規劃

方法優點缺點
記憶化搜索(自頂向下)直觀,遞歸寫法清晰可能有遞歸棧溢出
動態規劃(自底向上)迭代方式,減少遞歸棧使用需要找到最優狀態轉移方程

2. 記憶化搜索應用場景

? 斐波那契數列:避免指數級遞歸。
? 最長路徑問題(滑雪):存儲已訪問路徑,避免重復計算。
? 數論問題(冰雹數):存儲已計算結果,避免深度遞歸。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71919.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71919.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71919.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

反爬蟲策略

反爬蟲策略是網站用于防止自動化程序&#xff08;爬蟲&#xff09;惡意抓取數據的核心手段&#xff0c;其設計需兼顧有效性、用戶體驗和合法性。 一、 基礎檢測與攔截 User-Agent檢測&#xff1a;驗證請求頭中的User-Agent&#xff0c;攔截非常見或已知爬蟲標識。IP頻率限制&…

Java 實現快速排序算法:一條快速通道,分而治之

大家好&#xff0c;今天我們來聊聊快速排序&#xff08;QuickSort&#xff09;算法&#xff0c;這個經典的排序算法被廣泛應用于各種需要高效排序的場景。作為一種分治法&#xff08;Divide and Conquer&#xff09;算法&#xff0c;快速排序的效率在平均情況下非常高&#xff…

深入解析 Spring 中的 BeanDefinition 和 BeanDefinitionRegistry

在 Spring 框架中&#xff0c;BeanDefinition 和 BeanDefinitionRegistry 是兩個非常重要的概念&#xff0c;它們共同構成了 Spring IoC 容器的核心機制。本文將詳細介紹這兩個組件的作用、實現以及它們之間的關系。 一、BeanDefinition&#xff1a;Bean 的配置描述 1.1 什么…

《OpenCV》——光流估計

什么是光流估計&#xff1f; 光流估計的前提&#xff1f; 基本假設 亮度恒定假設&#xff1a;目標像素點的亮度在相鄰幀之間保持不變。這是光流計算的基礎假設&#xff0c;基于此可以建立數學方程來求解光流。時間連續或運動平滑假設&#xff1a;相鄰幀之間的時間間隔足夠小&a…

信息系統的安全防護

文章目錄 引言**1. 物理安全****2. 網絡安全****3. 數據安全****4. 身份認證與訪問控制****5. 應用安全****6. 日志與監控****7. 人員與管理制度****8. 其他安全措施****9. 安全防護框架**引言 從技術、管理和人員三個方面綜合考慮,構建多層次、多維度的安全防護體系。 信息…

如何進行OceanBase 運維工具的部署和表性能優化

本文來自OceanBase 用戶的實踐分享 隨著OceanBase數據庫應用的日益深入&#xff0c;數據量不斷攀升&#xff0c;單個表中存儲數百萬乃至數千萬條數據的情況變得愈發普遍。因此&#xff0c;部署專門的運維工具、實施針對性的表性能優化策略&#xff0c;以及加強指標監測工作&…

如何防止 Instagram 賬號被盜用:安全設置與注意事項

如何防止 Instagram 賬號被盜用&#xff1a;安全設置與注意事項 在這個數字化時代&#xff0c;社交媒體平臺如 Instagram 已成為我們日常生活的一部分。然而&#xff0c;隨著網絡犯罪的增加&#xff0c;保護我們的在線賬戶安全變得尤為重要。以下是一些關鍵的安全設置和注意事…

Redis|復制 REPLICA

文章目錄 是什么能干嘛怎么玩案例演示復制原理和工作流程復制的缺點 是什么 官網地址&#xff1a;https://redis.io/docs/management/replication/Redis 復制機制用于將數據從一個主節點&#xff08;Master&#xff09;復制到一個或多個從節點&#xff08;Slave&#xff09;&a…

對象存儲之Ceph

Ceph 對象存儲概述 Ceph 是一個開源分布式存儲系統&#xff0c;旨在提供高度可擴展、高度可用、容錯、性能優異的存儲解決方案。它結合了塊存儲、文件系統存儲和對象存儲的功能&#xff0c;且在設計上具有極高的可擴展性和靈活性。 在 Ceph 中&#xff0c;對象存儲&#xff0…

Document對象

DOM4j中&#xff0c;獲得Document對象的方式有三種&#xff1a; 1.讀取XML文件,獲得document對象 SAXReader reader new SAXReader(); Document document reader.read(new File("input.xml")); 2.解析XML形式的文本,得到document對象…

樹莓集團南京產業園再布局:深入剖析背后邏輯

在產業園區蓬勃發展的當下&#xff0c;樹莓集團在南京的產業園再布局行動備受矚目。這一舉措并非偶然&#xff0c;其背后蘊含著深刻且多元的戰略邏輯。 一、順應區域產業發展趨勢 南京作為長三角地區的重要城市&#xff0c;產業基礎雄厚且多元。近年來&#xff0c;南京大力推動…

Pytorch實現之腦電波圖像生成

簡介 簡介:采用雙GAN模型架構來生成腦電波與目標圖像。 論文題目:Image Generation from Brainwaves using Dual Generative Adversarial Training(使用雙生成對抗訓練的腦電波圖像生成) 會議:IEEE Global Conference on Consumer Electronics (GCCE) 摘要:表示通過無…

HTML解析 → DOM樹 CSS解析 → CSSOM → 合并 → 渲染樹 → 布局 → 繪制 → 合成 → 屏幕顯示

一、關鍵渲染流程 解析 HTML → 生成 DOM 樹 瀏覽器逐行解析 HTML&#xff0c;構建**DOM&#xff08;文檔對象模型&#xff09;**樹狀結構 遇到 <link> 或 <style> 標簽時會暫停 HTML 解析&#xff0c;開始加載 CSS 解析 CSS → 生成 CSSOM 將 CSS 規則解析為**…

劍指offer - 面試題11 旋轉數組的最小數字

題目鏈接&#xff1a;旋轉數組的最小數字 第一種&#xff1a;正確寫法&#xff08;num[m]和nums[r]比較&#xff09; class Solution { public:/*** 代碼中的類名、方法名、參數名已經指定&#xff0c;請勿修改&#xff0c;直接返回方法規定的值即可** * param nums int整型v…

Spring源碼分析の循環依賴

文章目錄 前言一、循環依賴問題二、循環依賴的解決三、整體流程分析 前言 常見的可能存在循環依賴的情況如下&#xff1a; 兩個bean中互相持有對方作為自己的屬性。 ??類似于&#xff1a; 兩個bean中互相持有對方作為自己的屬性&#xff0c;且在構造時就需要傳入&#xff1a…

Docker 部署 Jenkins持續集成(CI)工具

[TOC](Docker 部署 Jenkins持續集成(CI)工具) 前言 Jenkins 是一個流行的開源自動化工具&#xff0c;廣泛應用于持續集成&#xff08;CI&#xff09;和持續交付&#xff08;CD&#xff09;的環境中。通過 Docker 部署 Jenkins&#xff0c;可以簡化安裝和配置過程&#xff0c;并…

《Effective Objective-C》閱讀筆記(中)

目錄 接口與API設計 用前綴避免命名空間沖突 提供“全能初始化方法” 實現description方法 盡量使用不可變對象 使用清晰而協調的命名方式 方法命名 ?編輯類與協議命名 為私有方法名加前綴 理解OC錯誤模型 理解NSCopying協議 協議與分類 通過委托與數據源協議進行…

C++程序員內功修煉——Linux C/C++編程技術匯總

在軟件開發的宏大版圖中&#xff0c;C 語言宛如一座巍峨的高山&#xff0c;吸引著無數開發者攀登探索。而 Linux 操作系統&#xff0c;以其開源、穩定、高效的特性&#xff0c;成為了眾多開發者鐘愛的開發平臺。將 C 與 Linux 相結合&#xff0c;就如同為開發者配備了一把無堅不…

數據庫索引:缺點與類型全解析

在數據庫的世界里&#xff0c;索引就像是一本書的目錄&#xff0c;它能幫助我們快速定位到所需的數據&#xff0c;極大地提升查詢效率。然而&#xff0c;就如同任何事物都有兩面性一樣&#xff0c;索引也并非完美無缺。今天&#xff0c;我們就來深入探討一下索引的缺點以及常見…

【python】提取word\pdf格式內容到txt文件

一、使用pdfminer提取 import os import re from pdfminer.high_level import extract_text import docx2txt import jiebadef read_pdf(file_path):"""讀取 PDF 文件內容:param file_path: PDF 文件路徑:return: 文件內容文本"""try:text ext…