[Algorithm][回溯][記憶化搜索][最長遞增子序列][猜數字大小Ⅱ][矩陣中的最長遞增路徑]詳細講解

目錄

  • 1.最長遞增子序列
    • 1.題目鏈接
    • 2.算法原理詳解
    • 3.代碼實現
  • 2.猜數字大小 II
    • 1.題目鏈接
    • 2.算法原理詳解
    • 3.代碼實現
  • 3.矩陣中的最長遞增路徑
    • 1.題目鏈接
    • 2.算法原理詳解
    • 3.代碼實現


1.最長遞增子序列

1.題目鏈接

  • 最長遞增子序列

2.算法原理詳解

  • 題目解析:從每個位置,依次計算其最長遞增子序列
    請添加圖片描述

  • 思路選擇

    • 暴搜(遞歸) -> 本題會超時:P
    • 記憶化搜索
    • 動態規劃
  • 嘗試:暴搜 -> 記憶化搜索 -> 動態規劃

  • 暴搜

    • DFS()設計int DFS(nums, pos) -> 每次從pos位置找最長遞增子序列
    • 函數體:依次從pos位置往后枚舉,更新本次最長遞增子序列
  • 本題有大量重復要計算的值,故可以用記憶化搜索

  • 記憶化搜索

    • 備忘錄vector<int> mem
    • 返回之前,把結果存在備忘錄中
    • 遞歸之前,查找一下備忘錄是否有要找的值
  • 動態規劃

    • 注意:本題是前面的值依賴后面的值,所以**填表順序要從后往前填**

3.代碼實現

// v1.0 暴搜
class Solution 
{
public:int lengthOfLIS(vector<int>& nums) {int ret = 0;for(int i = 0; i < nums.size(); i++){ret = max(ret, DFS(nums, i));}return ret;}int DFS(vector<int>& nums, int pos){int ret = 1; // 細節:初值為1for(int i = pos + 1; i < nums.size(); i++){if(nums[i] > nums[pos]){ret = max(ret, DFS(nums, i) + 1);    }}return ret;}
};
-------------------------------------------------------------------------------
// v2.0 記憶化搜索
class Solution 
{vector<int> mem;
public:int lengthOfLIS(vector<int>& nums) {mem.resize(nums.size());int ret = 0;for(int i = 0; i < nums.size(); i++){ret = max(ret, DFS(nums, i));}return ret;}int DFS(vector<int>& nums, int pos){if(mem[pos] != 0){return mem[pos];}int ret = 1; // 細節:初值為1for(int i = pos + 1; i < nums.size(); i++){if(nums[i] > nums[pos]){ret = max(ret, DFS(nums, i) + 1);    }}mem[pos] = ret;return ret;}
};
-------------------------------------------------------------------------------
// v3.0 動態規劃
int lengthOfLIS(vector<int>& nums) 
{int n = nums.size();vector<int> dp(n, 1);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;
}

2.猜數字大小 II

1.題目鏈接

  • 猜數字大小 II

2.算法原理詳解

  • 題目思路解析

    • 每次給出一個數據范圍,從中找出花費最少的一次
    • 但是當一個結點的左右子樹返回時,要取最大的,因為要確保"能獲勝的最小金額",就要讓左右子樹的兩種情況都能實現
    • 最優解:取最小是在該范圍內,每個數對應的最終結果取最小
      請添加圖片描述
  • 思路選擇

    • 暴搜(遞歸) -> 本題會超時:P
    • 記憶化搜索
  • 暴搜

    • DFS()設計int DFS(int left, int right) -> 每次從[left, right]區間內找出最小的
    • 函數體:依次遍歷[left, right]中的各個數,遞歸分析左右?樹,求出所有情況下的最?值
    • 遞歸出口
      • left > right:區間不存在,返回0
      • left == right:就是最后的一個結果,此時無需花錢,返回0
  • 本題有大量重復要計算的值,故可以用記憶化搜索
    請添加圖片描述

  • 記憶化搜索

    • 備忘錄vector<int> mem
    • 返回之前,把結果存在備忘錄中
    • 遞歸之前,查找一下備忘錄是否有要找的值

3.代碼實現

// v1.0 暴搜
class Solution 
{
public:int getMoneyAmount(int n) {return DFS(1, n);}int DFS(int left, int right){if(left >= right){return 0;}int ret = INT_MAX;for(int i = left; i <= right; i++) // 選擇頭結點{int x = DFS(left, i - 1);int y = DFS(i + 1, right);ret = min(ret, max(x, y) + i);}return ret;}
};
------------------------------------------------------------------------
// v2.0 記憶化搜索
class Solution 
{vector<vector<int>> mem;
public:int getMoneyAmount(int n) {mem.resize(n + 1, vector(n + 1, 0));return DFS(1, n);}int DFS(int left, int right){if(left >= right){return 0;}if(mem[left][right] != 0){return mem[left][right];}int ret = INT_MAX;for(int i = left; i <= right; i++) // 選擇頭結點{int x = DFS(left, i - 1);int y = DFS(i + 1, right);ret = min(ret, max(x, y) + i);}mem[left][right] = ret;return ret;}
};

3.矩陣中的最長遞增路徑

1.題目鏈接

  • 矩陣中的最長遞增路徑

2.算法原理詳解

  • 題目解析:遍歷數組,對每個位置來一次DFS即可
  • 思路選擇
    • 暴搜(遞歸) -> 本題會超時:P
    • 記憶化搜索
  • 本題有大量重復要計算的值,故可以用記憶化搜索
    請添加圖片描述

3.代碼實現

// v1.0 暴搜
class Solution 
{int n, m;// "方向"向量數組int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};
public:int longestIncreasingPath(vector<vector<int>>& matrix) {n = matrix.size(), m = matrix[0].size();int ret = 0;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){ret = max(ret, DFS(matrix, i, j));}}return ret;}int DFS(vector<vector<int>>& matrix, int i, int j){int ret = 1;for(int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < n && y >= 0 && y < m && matrix[x][y] > matrix[i][j]){ret = max(ret, DFS(matrix, x, y) + 1);}}return ret;}
};
---------------------------------------------------------------------------
// v2.0 記憶化搜索
class Solution 
{int n, m;vector<vector<int>> mem;// "方向"向量數組int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};
public:int longestIncreasingPath(vector<vector<int>>& matrix) {n = matrix.size(), m = matrix[0].size();mem.resize(n, vector<int>(m, 0));int ret = 0;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){ret = max(ret, DFS(matrix, i, j));}}return ret;}int DFS(vector<vector<int>>& matrix, int i, int j){if(mem[i][j] != 0){return mem[i][j];}int ret = 1;for(int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < n && y >= 0 && y < m && matrix[x][y] > matrix[i][j]){ret = max(ret, DFS(matrix, x, y) + 1);}}return mem[i][j] = ret;}
};

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

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

相關文章

內部類知識點

什么是內部類&#xff1f; 內部類何時出現&#xff1f;B類是A類的一部分&#xff0c;且B單獨存在無意義 內部類分類 成員內部類&#xff1a; 當內部類被private修飾后&#xff0c;不能用方法2 調用外部類成員變量 內部類里面有隱藏的outer this來記錄 靜態內部類 創建對象&…

警惕Mallox勒索病毒的最新變種hmallox,您需要知道的預防和恢復方法。

引言 &#xff1a; 在數字化時代&#xff0c;數據已成為企業和個人最寶貴的資產之一。然而&#xff0c;隨著技術的不斷發展&#xff0c;網絡威脅也日益猖獗&#xff0c;其中.hmallox勒索病毒以其獨特的加密手段和狡猾的傳播方式&#xff0c;成為了網絡安全領域的一顆“隱形炸彈…

水電集中抄表是什么?

1.定義分析&#xff1a;水電集中抄表 水電集中抄表是一種現代化能源管理體系方法&#xff0c;它利用先進的信息科技&#xff0c;如物聯網技術、云計算等&#xff0c;完成對水電表數據的遠程智能采集與處理。這種方法改變了傳統的人工上門服務抄表方式&#xff0c;提高了效率&a…

Biome-BGC生態系統模型與Python融合技術實踐應用

Biome-BGC是利用站點描述數據、氣象數據和植被生理生態參數&#xff0c;模擬日尺度碳、水和氮通量的有效模型&#xff0c;其研究的空間尺度可以從點尺度擴展到陸地生態系統。 在Biome-BGC模型中&#xff0c;對于碳的生物量積累&#xff0c;采用光合酶促反應機理模型計算出每天…

ECharts實現地圖飛線

echarts版本&#xff1a;https://echarts.apache.org/zh/changelog.html v5.x.x版本&#xff1a;不提供china.js和china.json文件 v4.x.x版本&#xff1a;使用npm安裝echarts&#xff0c;默認包含china.js和china.json文件 目錄 一、Html工程 二、vue工程 三、vue工程 四、矢…

c/c++ 編譯過程

C的編譯過程通常可以分為四個階段&#xff1a;預處理、編譯、匯編和鏈接。下面是這四個階段的詳細說明&#xff1a; 預處理&#xff08;Preprocessing&#xff09;&#xff1a;在這個階段&#xff0c;預處理器&#xff08;cpp&#xff09;會處理源代碼文件中的預處理指令&#…

【科普知識】伺服電機中的內置制動器

在工業自動化和機器人技術快速發展的今天&#xff0c;伺服電機作為核心驅動元件&#xff0c;其性能與功能直接影響整個系統的運行效率與穩定性。 近年來&#xff0c;一體化伺服電機技術不斷融合創新&#xff0c;并逐步加入了許多新的硬件和軟件的功能&#xff0c;為工業自動化領…

【施磊】C++語言基礎提高:深入學習C++語言先要練好的內功

課程總目錄 文章目錄 一、進程的虛擬地址空間內存劃分和布局二、函數的調用堆棧詳細過程三、程序編譯鏈接原理1. 編譯過程2. 鏈接過程 一、進程的虛擬地址空間內存劃分和布局 任何的編程語言 → \to → 產生兩種東西&#xff1a;指令和數據 編譯鏈接完成之后會產生一個可執行…

python畢設項目選題匯總(全)

各位計算機方面的畢業生們&#xff0c;是不是在頭疼畢業論文寫什么呢&#xff0c;我這給大家提供點思路&#xff1a; 網站系統類 《基于python的招聘數據爬蟲設計與實現》 《基于python和Flask的圖書管理系統》 《基于照片分享的旅游景點推薦系統》 《基于djangoxadmin的學生信…

LeetCode hot100-47-N

105. 從前序與中序遍歷序列構造二叉樹給定兩個整數數組 preorder 和 inorder &#xff0c;其中 preorder 是二叉樹的先序遍歷&#xff0c; inorder 是同一棵樹的中序遍歷&#xff0c;請構造二叉樹并返回其根節點。這題放選擇題里還能選出來&#xff0c;前序中序一起確定了一顆什…

Linux備份服務及rsync企業備份架構(應用場景)

備份服務概述 備份服務:需要使用到腳本,打包備份,定時任務. 備份服務:rsyncd服務,不同主機之間數據傳輸. 特點&#xff1a; rsync是個服務也是命令使用方便&#xff0c;具有多種模式傳輸數據的時候是增量傳輸 增量與全量&#xff1a; 全量 &#xff1a;無論多少數據全部推…

貪心算法:合并區間

參考資料&#xff1a;代碼隨想錄 題目鏈接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 做過用最少數量的箭引爆氣球和無重疊區間這兩道題目后&#xff0c;題意和題解都不難理解。唯一的一點兒難點是對于api的運用。 class Solution {public int[][] merge(int[][…

設備管理全解析:從選購到報廢的全方位指南

在現代企業快速發展、智能化運營過程中&#xff0c;企業設備管理是保障生產連續性和效率的核心環節&#xff0c;其重要性不言而喻。然而&#xff0c;許多企業在設備管理內容流程方面仍然使用傳統管理辦法&#xff0c;這不僅影響了生產效率&#xff0c;也增加了不必要的成本。那…

vuejs路由和組件系統

前端路由原理 createRouter * hash* window.addEventListener(hashChange)* 兩種實現路由切換的模式&#xff1a;UI組件&#xff08;router-link&#xff0c;router-view&#xff09;&#xff0c;Api&#xff08;push()方法&#xff09; * history * HTML5新增的API &#xff0…

每日一題(1)

在看一本08年出版的書的時候&#xff0c;看到了這樣一個問題&#xff0c;感覺答案很奇怪&#xff1a; public class demo_p22 {public static void main(String args[]){int sCook1,sFish2;//各技能標記character ch1new character();if(ch1.haveSkill(sCook))System.out.print…

仙樂健康科技股份有限公司「E立方仿生增效技術平臺」推出新品啦

在這個看臉的顏值經濟時代,很多女性將肌膚保養作為人生的“必修課”,從各種網上攻略到高端護膚品,再到美容院的專業護理,可以說是應有盡有。最近,仙樂健康科技股份有限公司「E立方仿生增效技術平臺」推出的新品——PQQ鹽膠原小分子肽樺樹汁飲品,就受到了頗多追求健康美人士的關…

svg中漸變色的應用

設置漸變色背景 在 SVG 中可以使用<linearGradient>或<radialGradient>元素來設置漸變背景色。以下是一個簡單的示例&#xff1a; <svg width"400" height"400"><defs><linearGradient id"myGradient"><stop…

Discord運營攻略 | 從0-1教你搭建用戶社區!

Discord&#xff0c;這個最初為游戲愛好者設計的通訊平臺&#xff0c;現在已經發展成為了一個多元化的社區聚集地&#xff0c;涵蓋了各種興趣和行業。如果你是一名社媒運營人員&#xff0c;正在考慮如何從零開始構建一個充滿活力的Discord用戶社區&#xff0c;那么你來對地方了…

【CSP CCF記錄】202012-2 期末預測之最佳閾值

題目 過程 思路 第一次沒用前綴和&#xff0c;暴力求解得50分。 采用前綴和方法。 1. 對原數組stu[i]進行排序。 2. 計算前綴和數組s[]&#xff0c;s[i]表示安全指數的y_i的前綴和&#xff0c;即安全指數小于等于y_i時的實際掛科情況&#xff0c;y_i之前有多少個未掛科&am…