[Lc6_記憶化搜索] 不同路徑 | 解決智力問題 | 有序三元組中的最大值

目錄

1.不同路徑

題解

2140. 解決智力問題

題解

2873. 有序三元組中的最大值?

題解


1.不同路徑

鏈接:62. 不同路徑

一個機器人位于一個 m x n 網格的左上角 (起始點在下圖中標記為 “Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為 “Finish” )。

問總共有多少條不同的路徑?


題解

這個機器人位于左上角位置,每次只能向右和向下移動

  • 問從開始位置到終點一共有多少種不同的路徑。
  • 我們下標從1開始計數,這樣就少了很多邊界情況。

接下來我們用記憶化搜索解決這個問題。

如果純記憶化搜索我們只要兩步就可以了。

  • 第一步 先想出暴搜(遞歸)的代碼。
  • 第二步 暴搜代碼改成記憶化搜索,但是前提是能否改!

1.暴搜(遞歸)

我們最后向求出的m,n位置有多少種不同的走法

  • 那么就這樣搞dfs,dfs我給你兩個參數,dfs(i,j)
  • 你直接給我返回1,1到達i,j有多少種走法。

具體dfs你內部怎么走我不關心,我相信你一定能夠完成任務。

  • 接下來想想這個函數體 如何設計,我想從1,1到達這個三角的位置一共有多少種方式,其實只用關心兩個位置就可以。
  • 因為想到達三角的位置,必須要從這兩個圓圈到達,要求只能向右走向下走。
  • 如果此時我知道到達圓圈有多少種方式那在多走一步就走到三角了。
  • 也就是說到達圓圈有多少種方式,到達這個三角也有多少種方式。

因此僅需要達到兩個圓圈有多少種方式加起來就是到達三角位置的方式 dfs(i-1,j) + dfs(i,j-1)。

遞歸出口 我們考慮某個位置的時候,我們僅會考慮它上面的位置以及左邊的位置。

  • 有可能i=1的時候去考慮i-1不就越界了嗎
  • i=0的時候不能從非法位置達到這里。
  • 同理j=0也是一種非法情況,我們既要考慮上邊也要考慮左邊。因此

i == 0 || j == 0 return 0;

但還有一種隱藏遞歸出口

  • 當i == 1 && j == 1的時候是位于起點的
  • 上面和左邊都沒有所以需要特殊處理 i == 1 && j == 1 return 1
class Solution {
public:int uniquePaths(int m, int n) {//爆搜return dfs(m,n);}int dfs(int m,int n){//出口if(m==0 || n==0) return 0;if(m==1 && n==1) return 1;return dfs(m-1,n)+dfs(m,n-1);}
};

上面會超時,下面看看能否暴搜的代碼改成記憶化搜索。

在遞歸過程種發現大量重復的相同問題就可以用記憶化搜索

記憶化搜索

我們發現在遞歸過程種發現大量重復的相同問題因此可以用記憶化搜索

搞一個備忘錄

  • 遞歸之前,查找一下備忘錄
  • 返回之前,把結果存在備忘錄中

搞一個備忘錄 上一道題是搞一個一維數組,但是這道題dfs函數里面是有兩個可變參數,i和j一直在變化。

  • 里面的值是int,因此我可以搞一個int [m+1][n+1] 二維數組。
  • 因為要訪問到m,n的位置。

進前 瞅瞅。return 前 存存

class Solution {
public:vector<vector<int>> memo;int uniquePaths(int m, int n) {//記憶化搜索memo.resize(m+1,vector<int>(n+1,0));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) return 1;memo[m][n]=dfs(m-1,n)+dfs(m,n-1);return dfs(m-1,n)+dfs(m,n-1);}
};

解下來把記憶化搜索改成動態規劃。

  1. 多加一層的 初始化
  2. 循環內 要注意起點的值 continue ,防止被修改

2140. 解決智力問題

鏈接:2140. 解決智力問題

給你一個下標從 0 開始的二維整數數組 questions ,其中 questions[i] = [pointsi, brainpoweri]

這個數組表示一場考試里的一系列題目,你需要 按順序 (也就是從問題 0 開始依次解決),針對每個問題選擇 解決 或者 跳過 操作。解決問題 i 將讓你 獲得 pointsi 的分數,但是你將 無法 解決接下來的 brainpoweri 個問題(即只能跳過接下來的 brainpoweri 個問題)。如果你跳過問題 i ,你可以對下一個問題決定使用哪種操作。

  • 比方說,給你 questions = [[3, 2], [4, 3], [4, 4], [2, 5]]
    • 如果問題 0 被解決了, 那么你可以獲得 3 分,但你不能解決問題 12
    • 如果你跳過問題 0 ,且解決問題 1 ,你將獲得 4 分但是不能解決問題 23

請你返回這場考試里你能獲得的 最高 分數。


題解

剛好今天的每日一題

  • 暴力 選 or 不選 會超時

class Solution {
public:typedef long long ll;queue<vector<int>> q;ll ret;long long mostPoints(vector<vector<int>>& questions) {//dpdfs(questions,0,0);return ret;}void dfs(vector<vector<int>>& questions,int p,ll count){if(p>=questions.size()) //向下 再向上 //暴力 是會經歷兩次的{ret=max(ret,count);return;}
//選dfs(questions,p+questions[p][1]+1,count+questions[p][0]);
//不選dfs(questions,p+1,count); } 
};

采用 記憶化搜索,記錄 結果的記憶化遞歸,避免 重復進行

class Solution 
{int n = 0;unordered_map<int, long long> memo;
public:long long dfs(vector<vector<int>>& questions, int pos){if (pos >= n)return 0;if (memo.count(pos))return memo[pos];// 選 - 跳到 pos + brain + 1long long ret = questions[pos][0] + dfs(questions, pos + questions[pos][1] + 1);// 不選 - 跳到 pos + 1ret = max(ret, dfs(questions, pos + 1));memo[pos] = ret; //記錄 結果的記憶化遞歸return ret;}long long mostPoints(vector<vector<int>>& questions){n = questions.size();return dfs(questions, 0);}
};

采用動態規劃,優化


2873. 有序三元組中的最大值?

鏈接:2873. 有序三元組中的最大值 I

給你一個下標從 0 開始的整數數組 nums

請你從所有滿足 i < j < k 的下標三元組 (i, j, k) 中,找出并返回下標三元組的最大值。如果所有滿足條件的三元組的值都是負數,則返回 0

下標三元組 (i, j, k) 的值等于 (nums[i] - nums[j]) * nums[k]


題解

暴力

class Solution {
public:typedef long long ll;long long maximumTripletValue(vector<int>& nums) {//暴力ll ret=0;int n=nums.size();for(int i=0;i<n-2;i++){for(int j=i+1;j<n-1;j++){for(int k=j+1;k<n;k++){ret = max(ret,(ll)(nums[i] - nums[j]) * nums[k]);//!!!強轉}}}return ret;}
};

注意 max 比較對 ll 的強轉~

解法二:

類比:11.盛水最多的容器

利用單調性來進行空間換時間

class Solution {
public:typedef long long ll;long long maximumTripletValue(vector<int>& nums) {//利用單調性int n=nums.size();if (n < 3) return 0;  // 🌟 新增邊界條件ll ret=0;vector<int> max_left(n,0);  //ivector<int> max_right(n,0);  //k//空間換時間for(int j=1;j<n;j++){max_left[j]=max(max_left[j-1],nums[j-1]);
//!!!!!存儲當前位置所對應的最大左右值}for(int j=n-2;j>=0;j--){max_right[j]=max(max_right[j+1],nums[j+1]);}for(int j=1;j<n-1;j++){ret=max(ret,(ll)(max_left[j]-nums[j])*max_right[j]);}return ret;}
};

//!!!!!存儲當前位置所對應的最大左右值

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

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

相關文章

軟件重構與項目進度的矛盾如何解決

軟件重構與項目進度之間的矛盾可以通過明確重構目標與范圍、采用漸進式重構策略、優化項目管理流程、提高團隊溝通效率、建立重構意識文化等方式解決。其中&#xff0c;采用漸進式重構策略尤為關鍵。漸進式重構是指在日常開發過程中&#xff0c;以小步驟持續進行重構&#xff0…

多臺服務器上docker部署 Redis 集群

規劃集群節點 確保你的服務器有固定 IP&#xff0c;比如&#xff1a; 172.16.17.100 172.16.17.101 172.16.17.102 每臺服務器運行 2 個 Redis 節點&#xff0c;總共 6 個節點&#xff0c;滿足 Redis Cluster 最小節點數要求。 2. 在每臺服務器上運行 Redis 在每臺服務器上執行…

【Pandas】pandas DataFrame dtypes

Pandas2.2 DataFrame Attributes and underlying data 方法描述DataFrame.index用于獲取 DataFrame 的行索引DataFrame.columns用于獲取 DataFrame 的列標簽DataFrame.dtypes用于獲取 DataFrame 中每一列的數據類型 pandas.DataFrame.dtypes pandas.DataFrame.dtypes 屬性用…

如何實現局域網內無痛訪問Jupyter Notebook?

Jupyter Notebook是數據科學和機器學習領域非常常用的交互式開發環境。默認情況下&#xff0c;Jupyter Notebook啟動后只能本地訪問&#xff0c;并且會自動生成一個token用于身份驗證。當需要從其他電腦遠程訪問時&#xff0c;往往需要對配置進行修改。 本文將詳細介紹如何通過…

[Windows] eDiary 4.3.6 日記軟件

[Windows] eDiary 鏈接&#xff1a;https://pan.xunlei.com/s/VOMq6xmKTbEJtNaW-BXZ7KKSA1?pwdcrvu# 【應用功能】 加密 無論本地還是云端&#xff0c;都可以選擇高強度加密。系統以用戶密碼為種子&#xff0c;對數據進行…

掌握 Flexbox 布局:為容器添加豎向滾動條的完美方案

掌握 Flexbox 布局&#xff1a;為容器添加豎向滾動條的完美方案 前言 在現代網頁設計中&#xff0c;Flexbox 布局因其靈活性和強大的對齊功能而備受歡迎。然而&#xff0c;在實際開發過程中&#xff0c;我們有時會遇到需要在一個具有最小高度的 Flex 容器中實現內容溢出時顯示…

Node.js v22.14.0 多平臺安裝指南:Windows、Linux 和 macOS 詳細教程

Node.js作為現代Web開發的基石&#xff0c;持續為開發者帶來性能提升和新特性支持。本文將詳細介紹在Windows、macOS和Linux系統上安裝最新Node.js的多種方法&#xff0c;助您快速搭建高效的JavaScript開發環境。 &#x1f4e6; 當前最新版本 截至2025年4月&#xff0c;Node.…

動態規劃學習——回文子串系列問題【C++】

一&#xff0c;回文子串 題目鏈接&#xff1a;LCR 020. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 【問題描述】 求一個字符串中有多少個回文子串&#xff0c;其中一個字符也算是一個回文子串。 【解法】 動態規劃 求一個字符串中回文子串的個數&#xff0c;我么可…

My first day in QT programming

My first QT code this->setWindowTitle("HelloWorld"); //設置窗口名稱 this->resize(400, 300); //設置窗口大小 QPushButton* btn new QPushButton; //新建按鈕組件 btn->setParent(this); //為按鈕指定父對象 …

基于python開發的郵箱合并群發工具

智能郵件群發系統 一個基于Python和PyQt5開發的智能郵件群發工具&#xff0c;支持Word模板和Excel數據源的自動匹配&#xff0c;具有現代化UI界面和友好的用戶體驗。 Github項目地址&#xff1a;https://github.com/liugang926/Auto-mail-sent.git dist目錄有編譯好的exe程序&…

大模型-提示詞(Prompt)技巧

1、什么是提示詞&#xff1f; 提示詞&#xff08;Prompt&#xff09;是用戶發送給大語言模型的問題、指令或請求&#xff0c;用來明確地告訴模型用戶想要解決的問題或完成的任務&#xff0c;是大語言模型理解用戶需求并據此生成相關、準確回答或內容的基礎。對于大語言模型來說…

Android開發:support.v4包與AndroidX

Android中的support.v4包與AndroidX support.v4包概述 Android Support Library中的android.support.v4包是Google為保持Android應用向后兼容而提供的重要支持庫集合。它主要解決以下問題&#xff1a; API版本兼容&#xff1a;讓新版API能在舊版Android系統上使用功能增強&a…

TCP-IP模型

書接上回&#xff08;OSI通信模型&#xff09; TCP-IP協議結構 &#xff08;略講&#xff09; ARP&#xff1a;IP-->MAC RARP&#xff1a;MAC-->IP ICMP&#xff1a;控制報文信息協議&#xff0c;主要是涉及到主機就去連接路由器時控制傳輸報文&#xff08…

雪花算法生成的主鍵存在哪些問題,為什么不能使用自增ID或者UUID做MySQL的主鍵

MySQL 分布式架構中的主鍵選擇&#xff1a;自增ID、UUID與雪花算法 為什么MySQL分布式架構中不能使用自增主鍵&#xff1f; 在分布式架構中&#xff0c;自增主鍵存在以下問題&#xff1a; 主鍵沖突風險&#xff1a;多個數據庫實例同時生成自增主鍵會導致ID重復分片不均勻&am…

RapidJSON 處理 JSON(高性能 C++ 庫)(四)

第四部分:RapidJSON 處理 JSON(高性能 C++ 庫) ?? 快速掌握 JSON!文章 + 視頻雙管齊下 ?? 如果你覺得閱讀文章太慢,或者更喜歡 邊看邊學 的方式,不妨直接觀看我錄制的 RapidJSON 課程視頻!?? 視頻里會用更直觀的方式講解 RapidJSON 的核心概念、實戰技巧,并配有…

chromem-go + ollama + bge-m3 進行文檔向量嵌入和查詢

Ollama 安裝 https://ollama.com/download Ollama 運行嵌入模型 bge-m3:latest ollama run bge-m3:latestchromem-go 文檔嵌入和查詢 package mainimport ("context""fmt""runtime""github.com/philippgille/chromem-go" )func ma…

【LeetCode 題解】數據庫:180. 連續出現的數字

一、問題描述 給定一個Logs表&#xff0c;包含自增 ID 和數字字段&#xff1a; CREATE TABLE Logs (id INT PRIMARY KEY AUTO_INCREMENT,num VARCHAR(50) );要求編寫 SQL 查詢&#xff0c;找出所有至少連續出現三次的數字。例如&#xff1a; --------- | id | num | -------…

MaxEnt模型進階:基于R語言自動化與GIS空間建模的物種棲息地精準預測

生物多樣性的空間分布規律及其對環境變化的響應機制&#xff0c;是生態學與地理學研究的前沿議題。在氣候變化加劇和人類活動干擾的雙重壓力下&#xff0c;如何精準預測物種潛在分布范圍、識別關鍵環境驅動因子&#xff0c;已成為制定生物保護策略的核心科學問題。物種分布模型…

緩存雪崩解決方案:二級緩存VS隨機TTL

背景 在學習緩存雪崩的時候&#xff0c;了解到有二級緩存和隨機TTL兩個解決方案&#xff0c;但是在學習之后&#xff0c;個人認為二級緩存本質上還是利用兩層緩存的過期時間不一致來實現緩存過期時間隨機化&#xff0c;這不就是和隨機TTL一樣嗎&#xff0c;故有了這篇思考&…

Android View事件分發機制深度解析

在Android面試中&#xff0c;關于View事件分發機制的考察往往不僅限于基礎流程&#xff0c;更關注底層原理、性能優化和實際應用場景。以下是針對面試的全面回答策略&#xff1a; 一、基礎回答框架 核心三要素&#xff1a; 傳遞流程 "事件分發遵循Activity → Window →…