【leetcode】記憶化搜索

記憶化搜索

  • 一、斐波那契數
    • 1、題目描述
    • 2、代碼
    • 3、解析
  • 二、不同路徑
    • 1、題目描述
    • 2、代碼
    • 3、解析
  • 三、最長遞增子序列
    • 1、題目描述
    • 2、代碼
    • 3、解析
  • 四、猜數字大小II
    • 1、題目描述
    • 2、代碼
    • 3、解析
  • 五、矩陣中的最長遞增路徑
    • 1、題目描述
    • 2、代碼
    • 3、解析


一、斐波那契數

1、題目描述

leetcode鏈接
在這里插入圖片描述

2、代碼

常規遞歸暴搜代碼:

class Solution
{
public:int fib(int n){if(n == 0) return 0;if(n == 1) return 1;return fib(n - 1) + fib(n - 2);}
};

備忘錄版:

class Solution 
{
public:// 備忘錄int memo[31];int fib(int n) {memset(memo, -1, sizeof(memo)); // 先將備忘錄進行初始化為-1,因為-1根本就不會遇到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:// dp表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];    }
};

3、解析

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

二、不同路徑

1、題目描述

leetcode鏈接

在這里插入圖片描述

2、代碼

記憶化搜索:

class Solution 
{
public:vector<vector<int>> memo;int uniquePaths(int m, int n) {memo = vector<vector<int>>(m + 1, vector<int>(n + 1));return dfs(m, n);}int dfs(int i, int j){if(memo[i][j] != 0){return memo[i][j];}if(i == 0 || j == 0){return 0; // 越界情況}if(i == 1 && j == 1){memo[i][j] = 1;return 1;}memo[i][j] = dfs(i - 1, j) + dfs(i, j - 1);return memo[i][j];}
};

動態規劃:

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];}
};

3、解析

在這里插入圖片描述

三、最長遞增子序列

1、題目描述

leetcode鏈接

在這里插入圖片描述

2、代碼

記憶化搜索:

class Solution 
{
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();vector<int> memo(n); // 定義一個備忘錄int ret = 0;for(int i = 0; i < n; i++){ret = max(ret, dfs(i, nums, memo)); // 相信dfs一定能處理好往后進行遍歷}return ret;}int dfs(int pos, vector<int>& nums, vector<int>& memo){if(memo[pos] != 0) // 此處是已經使用過了{return memo[pos];}int ret = 1; // 必須從1開始,不然一直是0比較,會出現邊界情況for(int i = pos + 1; i < nums.size(); i++){if(nums[i] > nums[pos])ret = max(ret, dfs(i, nums, memo) + 1);}memo[pos] = ret; // 保存一下return memo[pos];}
};

動態規劃做法:

class Solution 
{
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();vector<int> dp(n, 1); // 定義一個有n個數為1的dp數組int ret = 0;// 從后往前遍歷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;}
};

3、解析

在這里插入圖片描述

四、猜數字大小II

1、題目描述

leetcode鏈接
在這里插入圖片描述

2、代碼

class Solution 
{
public:// 定義一個備忘錄vector<vector<int>> memo;int getMoneyAmount(int n) {memo = vector<vector<int>>(n + 1, vector<int>(n + 1));// 暴搜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, head + max(x, y)/*右邊或者左邊傳上來的最大值*/);}memo[left][right] = ret;return ret;}
};

3、解析

在這里插入圖片描述

五、矩陣中的最長遞增路徑

1、題目描述

leetcode鏈接

在這里插入圖片描述

2、代碼

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

3、解析

在這里插入圖片描述

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

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

相關文章

【java】小學生數學練習題目生成系統

本文章主要是CSDN-問答板塊&#xff0c;有題主提出的問題&#xff0c;我這邊將完整代碼提供出來&#xff0c;僅供大家參考學習&#xff01; 一、效果截圖 二、直接上代碼 package com.example.dingtalk.question;import javax.script.ScriptEngine; import javax.script.Scrip…

PHP實踐:Laravel中事件使用講解

&#x1f3c6;作者簡介&#xff0c;黑夜開發者&#xff0c;CSDN領軍人物&#xff0c;全棧領域優質創作者?&#xff0c;CSDN博客專家&#xff0c;阿里云社區專家博主&#xff0c;2023年6月CSDN上海賽道top4。 &#x1f3c6;數年電商行業從業經驗&#xff0c;歷任核心研發工程師…

kafka生產者

1.原理 2.普通異步發送 引入pom&#xff1a; <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.0.0</version></dependency><dependency><g…

“errcode“:40163,“errmsg“:“code been used

{"errcode":40163,"errmsg":"code been used, rid: 65d6fa01-6ae8fecc-3a2f4bf8"} 通過微信靜默授權方式&#xff0c;獲得當前微信用戶 openid 時&#xff0c;重復使用 code 造成的。 不是騰訊的問題&#xff0c;自己的代碼邏輯沒有遵循騰訊請…

2024022202-查詢優化

查詢優化 概述 關系系統和關系模型是兩個密切相關而有不同的概念。支持關系模型的數據庫管理系統稱為關系系統。但是關系模型中并非每一部分都是同等重要的&#xff0c;所以我們不苛求完全支持關系模型的系統才能稱為關系系統。因此&#xff0c;我們給出一個關系系統的最小要求…

excel數據處理——一列數據轉換為n列多行

按行抽取 如果只希望保留第一行的標題&#xff0c;然后將其他奇數行刪除&#xff0c;可以選擇一個空白列&#xff0c;為不同的行賦值&#xff0c;函數為“mod(row(),2)”&#xff1b; 這個是0,1 數列&#xff0c;如果是0,1&#xff0c;2就是“mod(row(),3)”。 行列轉換 復制…

【學習總結】慢SQL治理經驗總結

一、慢SQL定義 執行超過1s的SQL為慢SQL 三、慢SQl的風險 系統的響應時間延遲&#xff0c;影響用戶體驗 資源占用增加&#xff0c;增高了系統的負載&#xff0c;其他請求響應時間也可能會收到影響。 慢SQL占用數據庫連接的時間長,如果有大量慢SQL查詢同時執行&#xff0c;可能…

Waline評論服務端轉移至Deta

舊文首發地址 問題 前陣子評論系統又掛了&#xff0c;原因是*.vercel.app域名被污染。 解決方法 法一&#xff1a;服務端換個域名 法二&#xff1a;換個服務端部署 我選法二。 步驟 DETA官網&#xff1a;https://www.deta.sh/ Deta is free for ever. 這句話很不錯有木有…

C語言中的assert.h:調試助手與斷言詳解

在C語言編程中&#xff0c;assert.h頭文件提供了非常有用的斷言&#xff08;Assertion&#xff09;功能&#xff0c;它主要用于開發和調試階段&#xff0c;確保程序在運行時滿足某些預期條件。如果這些條件未得到滿足&#xff0c;則程序會立即停止執行&#xff0c;并打印出有關…

【MySQL】解決在join表時一對多的情況下重復數據的問題

在MySQL中進行JOIN操作&#xff0c;特別是在處理一對多關系的表時&#xff0c;可能會出現重復的記錄&#xff0c;這是因為左表&#xff08;或右表&#xff09;中的每一項在與右表&#xff08;或左表&#xff09;連接時&#xff0c;如果對應有多條匹配記錄&#xff0c;則會生成多…

冷鏈物流追蹤:Java與MySQL的協同實踐

??計算機編程指導師 ??個人介紹&#xff1a;自己非常喜歡研究技術問題&#xff01;專業做Java、Python、微信小程序、安卓、大數據、爬蟲、Golang、大屏等實戰項目。 ??實戰項目&#xff1a;有源碼或者技術上的問題歡迎在評論區一起討論交流&#xff01; ?? Java實戰 |…

第三百六十一回

文章目錄 1. 概念介紹2. 實現方法2.1 環繞效果2.2 立體效果 3. 示例代碼4. 內容總結 我們在上一章回中介紹了"自定義SlideImageSwitch組件"相關的內容&#xff0c;本章回中將介紹兩種陰影效果.閑話休提&#xff0c;讓我們一起Talk Flutter吧。 1. 概念介紹 我們在本…

Gson 庫的使用

Gson 是由 Google 開發的一個流行的 Java 庫,用于處理 JSON 數據的序列化和反序列化。它提供了簡單易用的 API,使得在 Java 應用程序中操作 JSON 數據變得非常方便。 以下是 Gson 庫的一些主要特點和用法 簡單易用 Gson 提供了一個簡單而直觀的 API,使得在 Java 應用程序中…

谷歌seo推廣怎么做?

除了常規的優化之外&#xff0c;還可以針對特定垂直搜索進行優化&#xff0c;比如圖片的以及視頻的搜索優化&#xff0c;這對于販賣自己產品的網站來說也是挺重要的一點 圖片需要確保您的圖片文件名包含相關關鍵詞&#xff0c;并為每張圖片添加描述性的ALT文本&#xff0c;以幫…

經濟學-信用貨幣初始發行與派生

由于黃金美元的種種缺陷&#xff0c;經濟學家找到了一種替代黃金的方案&#xff0c;這種替代品就是債務&#xff0c;它可以解決黃金有限的問題&#xff0c;并且債務這種抵押品耗費的人力物力遠遠低于其他抵押品&#xff08;例如黃金還得需要開采&#xff09; 假設一個國家剛剛…

調用 Python 函數遺漏括號 ( )

調用 Python 函數遺漏括號 1. Example - error2. Example - correctionReferences 1. Example - error name "Forever Strong" print(name.upper()) print(name.lower)FOREVER STRONG <built-in method lower of str object at 0x0000000002310670>---------…

Swift基礎知識:22.Swift構造過程

在 Swift 中&#xff0c;構造過程是實例化一個類、結構體或枚舉實例的過程&#xff0c;它包括設置實例的初始狀態和執行其他必要的設置。構造過程通過定義構造器&#xff08;initializer&#xff09;來實現&#xff0c;構造器是一種特殊的方法&#xff0c;用于創建和初始化實例…

SqlServer2016離線安裝--Microsoft R Open 和 Microsoft R Server安裝文件位置

問題 SQL SERVE 2016離線安裝&#xff0c;會出現“Microsoft R Open 和 Microsoft R Server 脫機安裝”的界面&#xff0c; 無法點擊下一步的情況&#xff0c;如下圖&#xff1a; 原因 離線安裝時需要下載兩個文件 解決方案 1、訪問路徑下載文件 https://go.microsoft.c…

Python 實現 OBV 指標計算:股票技術分析的利器系列(7)

Python 實現 OBV 指標計算&#xff1a;股票技術分析的利器系列&#xff08;7&#xff09; 介紹算法解釋 代碼rolling函數介紹核心代碼計算 VA 列計算 OBV 列計算 MAOBV 完整代碼 介紹 OBV 指標是“On-Balance Volume”的縮寫&#xff0c;意為“量價平衡指標”。它是一種用于衡…

《游戲引擎架構》 -- 學習4

資源及文件系統 文件系統 游戲引擎的文件系統API通常提供以下功能&#xff1a; 搜需路徑&#xff1a;是含一串路徑的字符串&#xff0c;各路徑之間以特殊字符&#xff08;如冒號或分號&#xff09;分隔&#xff0c;找文件時就會從這些路徑進行搜尋。例如在命令行下執行程序&a…