dfs記憶化搜索刷題 + 總結

文章目錄

  • 記憶化搜索 vs 動態規劃
  • 斐波那契數
    • 題解
    • 代碼
  • 不同路徑
    • 題解
    • 代碼
  • 最長遞增子序列
    • 題解
    • 代碼
  • 猜數字大小II
    • 題解
    • 代碼
  • 矩陣中的最長遞增路徑
    • 題解
    • 代碼
  • 總結

記憶化搜索 vs 動態規劃

1. 記憶化搜索:有完全相同的問題/數據保存起來,帶有備忘錄的遞歸
2.記憶化搜索的步驟:
1、添加一個備忘錄 <可變參數,返回值>
2、遞歸每次返回的時候,將結果放入備忘錄中
3、在每次進入遞歸的時候,往備忘錄中查找一下

3. 記憶化搜索和常規的動態規劃都是動態規劃,暴搜 -> 記憶化搜索 -> 動態規劃
4. 有大量重復的問題才能改成記憶化搜索

在這里插入圖片描述

斐波那契數

題目鏈接
在這里插入圖片描述

題解

1. 創建一個備忘錄
2. 把備忘錄中的值初始化為斐波那契數中不可能出現的的值-1
3. 在每次遞歸完成之前,把值存入備忘錄中
4. 在每次進入遞歸的時候,查找一下備忘錄中是否有值,有值就直接返回,相當于剪枝

代碼

class Solution 
{
public:// 記憶化搜索int memo[31];int fib(int n) {memset(memo,-1,sizeof memo);return dfs(n);}int dfs(int n){if(memo[n] != -1){return memo[n];}if(n == 0 || n == 1){memo[n] = n;return n;}memo[n] = dfs(n-1) + dfs(n-2);return memo[n];}
};// 動態規劃
class Solution 
{
public:int dp[31];int fib(int n) {dp[0] = 0,dp[1] = 1;for(int i = 2;i <= n;i++){dp[i] = dp[i-1] + dp[i-2];}return dp[n];}
};

不同路徑

題目鏈接
在這里插入圖片描述

題解

1. 函數頭的設計,只需要i和j的坐標
2. 返回條件:i == 0 || j == 0都是返回0
i == 1 && j == 1 第一個點返回1
3. 記憶化搜索就是創建一個二維的備忘錄,在遞歸之前往備忘錄中查找一下,返回之前把結果都存在備忘錄中

在這里插入圖片描述

代碼

// 記憶化搜索
class Solution 
{
public:int memo[102][102];int uniquePaths(int m, int n) {return dfs(m,n);}int dfs(int m,int n){// 往備忘錄中查找一下if(memo[m][n]) return memo[m][n];   // 返回條件if(m == 0 || n == 0) return 0;// 第一個點if(m == 1 && n == 1){memo[m][n] = 1;return 1;} memo[m][n] = dfs(m-1,n) + dfs(m,n-1);return memo[m][n];}
};// 動態規劃
class Solution 
{
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m+1,vector<int>(n+1));dp[1][1] = 1;for(int i = 1;i <= m;i++){for(int j = 1;j <= n;j++){if(i == 1 && j == 1) continue;dp[i][j] = dp[i-1][j] + dp[i][j-1];}}    return dp[m][n];}
};

最長遞增子序列

題目鏈接
在這里插入圖片描述

題解

1. 記憶化搜索:每次枚舉以pos位置為起點的最長遞增子序列,讓pos+1位置的值和pos位置比較大小,如果大于就加一,函數頭需要nums和pos位置,函數體需要pos+1位置到n-1位置,dfs會完成找到最大遞增子序列的工作,+1是加上本身
2. 動態規劃:從后往前添加狀態,第一個循環用來枚舉位置,第二個循環用來比較大小,更新最長遞增子序列到dp[i]中,內層循環結束,更新一下最長的子序列,因為不知道哪個位置是最大的

在這里插入圖片描述

代碼

 // 記憶化搜索
class Solution 
{
public:int memo[2510];int lengthOfLIS(vector<int>& nums) {int ret = 1;// 每次以i位置為起點往后搜索for(int i = 0;i < nums.size();i++){ret = max(dfs(nums,i),ret);}return ret;}int dfs(vector<int>& nums,int pos){if(memo[pos] != 0) return memo[pos];int ret = 1;for(int i = pos+1;i < nums.size();i++){if(nums[i] > nums[pos])ret = max(ret,dfs(nums,i)+1);}memo[pos] = ret;return memo[pos];}
};// 動態規劃
class Solution 
{
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();// 最短的子序列都是1vector<int> dp(n,1);int ret = 1;for(int i = n-1;i >= 0;i--){for(int j = i+1;j < n;j++){if(nums[j] > nums[i]){dp[i] = max(dp[i],dp[j] + 1);}}ret = max(ret,dp[i]);}    return ret;}
};

猜數字大小II

題目鏈接
在這里插入圖片描述

題解

1. 暴搜 -> 記憶化搜索
2. 算法原理:在區間[1,n]固定一個點i,分為左右區間,尋找花費最小金錢達到必勝的方案,方案數是不止實例一那一種的,然后在左右枝中尋找所花費金額的最大值才能勝利
3. 函數頭需要傳參左右區間,函數體需要實現尋找多種方案中的最小花費和當前方案下的最大金錢,出現了重復的數據可以使用記憶化搜索

在這里插入圖片描述

代碼

class Solution 
{
public:int memo[201][201];int getMoneyAmount(int n) {// 計算出所有方案數中的最小花費return dfs(1,n);}int dfs(int left,int right){if(left >= right) return 0;if(memo[left][right] != 0) return memo[left][right];int ret = INT_MAX;for(int head = left;head <= right;head++){int x = dfs(left,head-1);int y = dfs(head+1,right);ret = min(ret,max(x,y) + head);}memo[left][right] = ret;return ret;}
};

矩陣中的最長遞增路徑

題目鏈接
在這里插入圖片描述

題解

1. 算法原理:從一個點開始dfs,暴力枚舉出每一個遞增的路徑,返回其中最長的路徑即可
2. dfs函數的設計,需要i,j坐標去搜索每一個位置
3. 記憶化數組,如果出現相同的路徑,不用再次dfs,直接返回即可

在這里插入圖片描述

代碼

class Solution 
{
public:int memo[201][201];int m,n;int longestIncreasingPath(vector<vector<int>>& matrix) {int ret = 1;m = matrix.size(),n = matrix[0].size();for(int i = 0;i < m;i++){for(int j = 0;j < n;j++){ret = max(ret,dfs(matrix,i,j));}}return ret;}int dx[4] = {-1,1,0,0};int dy[4] = {0,0,-1,1};int dfs(vector<vector<int>>& matrix,int i,int j){if(memo[i][j]) return memo[i][j];int ret = 1;for(int k = 0;k < 4;k++){int x = dx[k] + i,y = dy[k] + j;if(x >= 0 && x < m && y >= 0 && y < n && matrix[x][y] > matrix[i][j]){ret = max(ret,dfs(matrix,x,y) + 1);}}memo[i][j] = ret;return ret;}
};

總結

1. 記憶化搜索就是先把暴力的dfs先寫出來,然后加一個備忘錄優化
2. 記憶化搜索也和常規的動態規劃是一樣的,即記憶化搜索也可以改為動態規劃的代碼
3. 出現大量重復的數據可以使用記憶化搜索,記憶化搜索可以使原本O(2^n)時間復雜度降為O(n)

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

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

相關文章

【HTML】驗證與調試工具

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;HTML CSS JavaScript 文章目錄 1. HTML 驗證工具概述1.1 驗證的重要性1.2 常見 HTML 錯誤類型 2. W3C 驗證服務2.1 W3C Markup Validation Service2.2 使用 W3C 驗證器2.3 驗證結果解讀 3. 瀏覽器開發者工具3.1 Chrome DevTools…

認識rand, srand, time函數,生成隨機數

要完成猜數字游戲&#xff0c;首先要生成隨機數&#xff0c;那么該怎么生成隨機數&#xff1f;、 1.rand函數 rand函數是庫函數&#xff0c;使用的時候要使用頭文件stdlib.h c語言中&#xff0c;提供了rand函數來生成隨機數&#xff0c;來看一下函數使用&#xff1a; 但是r…

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多變量時序預測(Matlab)

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多變量時序預測&#xff08;Matlab&#xff09; 目錄 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多變量時序預測&#xff08;Matlab&#xff09;預測效果基本介紹程序設計參考資料 預測效果 基本介紹 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多…

Go語言從零構建SQL數據庫引擎(2)

SQL標準與數據庫系統實現差異 在上一節中&#xff0c;我們了解了關系型數據庫的基礎概念。現在&#xff0c;讓我們深入探討SQL語言標準以及不同數據庫系統之間的實現差異。 SQL語言的誕生與演進 想象你經營的咖啡店生意蒸蒸日上&#xff0c;需要一個更強大的系統來管理數據。…

智能導診系統的技術體系組成

智能導診系統的技術體系由基礎支撐技術、核心交互技術、應用場景技術及安全保障技術構成&#xff0c;具體可歸納為以下六個維度&#xff1a; 一、基礎支撐技術 1、AI大模型與深度學習 醫療大模型&#xff1a;如騰訊醫療AI、DeepSeek等&#xff0c;通過海量醫學文獻和病例訓…

QML輸入控件: TextField(文本框)的樣式定制

目錄 引言示例簡介示例代碼與關鍵點示例1&#xff1a;基礎樣式定制示例2&#xff1a;添加圖標示例3&#xff1a;交互式元素&#xff08;清除按鈕&#xff09; 實現要點總結完整工程下載 引言 在Qt Quick應用程序開發中&#xff0c;文本輸入是最常見的用戶交互方式之一。TextFi…

leetcode hot100 多維動態規劃

1??2?? 多維動態規劃&#xff08;區間 DP、狀態機 DP&#xff09; 62. 不同路徑 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖…

3.27學習總結 爬蟲+二維數組+Object類常用方法

高精度&#xff1a; 一個很大的整數&#xff0c;以字符串的形式進行接收&#xff0c;并將每一位數存儲在數組內&#xff0c;例如100&#xff0c;即存儲為[1][0][0]。 p2437蜜蜂路線 每一個的路線數前兩個數的路線數相加。 #include <stdio.h> int a[1005][1005]; int …

車載以太網網絡測試-26【SOME/IP-通信方式-2】

目錄 1 摘要2 Method &#xff08;FF/RR&#xff09;、Event、Filed介紹2.1. SOME/IP Method 接口2.1.1 **Fire & Forget (FF)** - 單向調用2.1.2 **Request/Response (RR)** - 請求/響應模式2.1.3 **車載ECU通信實現示例**:2.1.4 **通信序列示例**2.1.5 實現注意事項 2.2 …

把doi直接插入word中,然后直接生成參考文獻

這段代碼通過提取、查詢、替換DOI&#xff0c;生成參考文獻列表來處理Word文檔&#xff0c;可按功能模塊劃分&#xff1a; 導入模塊 import re from docx import Document from docx.oxml.ns import qn from habanero import Crossref導入正則表達式模塊re用于文本模式匹配&a…

[C++] : C++11 右值引用的理解

&#xff08;一&#xff09;什么是左值和右值&#xff1f; 傳統的C語法中就有引用的語法&#xff0c;而C11中新增了的右值引用語法特性&#xff0c;所以從現在開始我們 之前學習的引用就叫做左值引用。無論左值引用還是右值引用&#xff0c;都是給對象取別名。 1.左值 左值是一…

windows服務器切換到linux服務器踩坑點

單節點環境依賴性 單節點問題&#xff0c;影響業務可用性&#xff0c;windows影響后續自動化&#xff0c;健壯性的提升&#xff0c;需要進行linux化 每個服務至少是雙節點&#xff0c;防止單點故障&#xff0c;提升系統的可用性&#xff0c;健壯性。linux化后可以進行docker化…

美顏SDK兼容性挑戰:如何讓美顏濾鏡API適配iOS與安卓?

如何讓美顏濾鏡API同時適配iOS與Android&#xff0c;并確保性能流暢、效果一致&#xff0c;是開發者面臨的一大挑戰。今天&#xff0c;我將與大家一同深度剖析美顏SDK的跨平臺兼容性問題&#xff0c;并分享優化適配方案。 一、美顏SDK兼容性面臨的挑戰 1.1不同平臺的圖像處理框…

Vue3 表單

Vue3 表單 隨著前端技術的發展,Vue.js 作為一款流行的前端框架,不斷更新迭代,以適應更高效、更便捷的開發需求。Vue3 作為 Vue.js 的第三個主要版本,引入了許多新特性和改進,其中包括對表單處理機制的優化。本文將深入探討 Vue3 表單的使用方法、技巧以及注意事項。 1. …

筆記:代碼隨想錄算法訓練營day62:108.冗余連接、109.冗余連接II

學習資料&#xff1a;代碼隨想錄 108. 冗余連接 卡碼網題目鏈接&#xff08;ACM模式&#xff09; 判斷是否有環的依據為&#xff0c;利用并查集&#xff0c;isSame函數&#xff0c;判斷當下這條邊的兩個節點入集前是否為同根&#xff0c;如果是的話&#xff0c;該邊就是會構…

RK3588,V4l2 讀取Gmsl相機, Rga yuv422轉換rgb (mmap)

RK3588, 使用V4l2 讀取 gmsl 相機,獲得yuv422格式圖像, 使用 rga 轉換 rgb 圖像。減少cpu占用率. 內存管理方式采用 mmap… 查看相機信息 v4l2-ctl --all -d /dev/cam0 , 查看自己相機分辨率,輸出格式等信息,對應修改后續代碼測試… Driver Info:Driver name : rkcif…

Kubernetes》k8s》Containerd 、ctr 、cri、crictl

containerd ctr crictl ctr 是 containerd 的一個客戶端工具。 crictl 是 CRI 兼容的容器運行時命令行接口&#xff0c;可以使用它來檢查和調試 k8s 節點上的容器運行時和應用程序。 ctr -v 輸出的是 containerd 的版本&#xff0c; crictl -v 輸出的是當前 k8s 的版本&#x…

Vue 入門到實戰 十一 Vuex

目錄 11.1狀態管理與應用場景 1&#xff09;state 2&#xff09;Getters 3&#xff09;Mutations 4&#xff09;Actions 5&#xff09;Module 11.2Vuex的安裝與基本應用 11.3Vuex的核心概念 一句話解釋vuex&#xff1a;就是單獨成立一個組件&#xff0c;這個組件存儲共…

【YOLOv11】目標檢測任務-實操過程

目錄 一、torch環境安裝1.1 創建虛擬環境1.2 啟動虛擬環境1.3 安裝pytorch1.4 驗證cuda是否可用 二、yolo模型推理2.1 下載yolo模型2.2 創建模型推理文件2.3 推理結果保存路徑 三、labelimg數據標注3.1 安裝labelimg3.2 解決浮點數報錯3.3 labelimg UI界面介紹3.4 數據標注案例…

探索 Vue 中的多語言切換:<lang-radio /> 組件詳解!!!

探索 Vue 中的多語言切換&#xff1a;<lang-radio /> 組件詳解 &#x1f30d; 嗨&#xff0c;大家好&#xff01;&#x1f44b; 今天我們來聊聊如何在 Vue 項目中實現一個優雅的多語言切換功能——<lang-radio /> 組件。這是一個小而美的組件&#xff0c;出現在登…