動態規劃——打家劫舍(C++)

好像,自己讀的書確實有點少了。

——2024年7月2日


198. 打家劫舍 - 力扣(LeetCode)

題目描述

????????你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定一個代表每個房屋存放金額的非負整數數組,計算你?不觸動警報裝置的情況下?,一夜之內能夠偷竊到的最高金額。

示例 1:

輸入:[1,2,3,1]
輸出:4
解釋:偷竊 1 號房屋 (金額 = 1) ,然后偷竊 3 號房屋 (金額 = 3)。偷竊到的最高金額 = 1 + 3 = 4。

示例 2:

輸入:[2,7,9,3,1]
輸出:12
解釋:偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接著偷竊 5 號房屋 (金額 = 1)。偷竊到的最高金額 = 2 + 9 + 1 = 12。

題解思路

? ? ? ? 動態規劃

????????利用動態規劃解題的時候,dp數組的含義都是自己定的,定好之后就需要思考自己如何實現,列出狀態轉移方程,題目就迎刃而解了。

?解法一

1. 定義dp數組含義;

? ? ? ? dp[i]表示偷取以 i 結尾的房間能夠獲取的最大價值。

2. 根據dp含義列出狀態轉移方程;

? ? ? ? 因為小偷不能偷取連續的兩個房間,那么如果偷取了第 i 個房間,第 i-1 間房間就不能偷取了,否則會觸發警報,但是 i-2 以前的所有房間都是可以偷取的,所以列出狀態轉移方程如下:
????????dp[i] = max( dp[0], dp[1], ..., dp[i - 2] ) + nums[i];

3. 確定邊界條件;

? ? ? ??①如果只有一個房間,那么dp[0] = nums[0];
????????②如果只有兩個房間,那么dp[1] = max(nums[0], nums[1]);

4.思考實現方式;

? ? ? ? 對于dp[i] = max( dp[0], dp[1], ..., dp[i - 2] ) + nums[i]如何實現呢?

????????思考這段方程的含義:這段方程是實現每次偷取第 i 個房間的時候選取前 i-2 個房間中能夠獲取的最大價值,考慮利用大根堆的優先隊列實現。

? ? ? ? 因為每次都要選取前 i - 2 個中的最大值,而大根堆的堆頂元素又是整個堆的最大值,可以考慮在 i = 2時開始向優先隊列中插入元素,這樣就能保證每次取出堆頂元素就是前 i - 2 個值中的最大值。

代碼實現
class Solution {
public:int rob(vector<int>& nums) {// 利用優先隊列和動態規劃完成 dp[i] = max(dp[0]...dp[i-2]) + nums[i]// dp[i]表示偷取以i結尾的房間的最大價值和int len = nums.size();priority_queue<int> pq;vector<int> dp(len, 0);dp[0] = nums[0];int maxValue = nums[0];for(int i = 1; i < len; i++){if(i >= 2){pq.push(dp[i-2]);}if(i == 1){dp[i] = max(nums[i-1], nums[i]);}else{dp[i] = pq.top() + nums[i];}maxValue = max(maxValue, dp[i]);}return maxValue;}
};

解法二

1. 定義dp數組含義;

????????dp[i]表示偷取前 i 個房間能夠獲得的最大價值;

2. 根據dp含義列出狀態轉移方程;

? ? ? ??每個房間都有偷與不偷兩種可能,那么在計算dp[i]的時候就會出現兩種情況;
????????①偷:dp[i] = dp[i-2] + nums[i];//不能偷連續的兩個房間
? ? ? ? ②不偷:dp[i] = dp[i-1];//如果不偷那么當前的最大價值就是dp[i-1]的最大價值。

3. 確定邊界條件;

? ? ? ??①如果只有一個房間,那么dp[0] = nums[0];
????????②如果只有兩個房間,那么dp[1] = max(nums[0], nums[1]);

4.思考實現方式;

? ? ? ??這個相對于解法一就很好實現了,利用vector容器即可。

代碼實現
class Solution {
public:int rob(vector<int>& nums) {// dp[i]表示偷取前i的房間的最大價值和int len = nums.size();vector<int> dp(len, 0);dp[0] = nums[0];for(int i = 1; i < len; i++){if(i == 1){dp[i] = max(nums[0], nums[1]);}else{dp[i] = max(dp[i-1], dp[i-2] + nums[i]);}}return dp[len-1];}
};

結果展示

解法一解法二

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

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

相關文章

Linux 靜態庫和動態庫

不管是Linux還是Windows中的庫文件其本質和工作模式都是相同的, 只不過在不同的平臺上庫對應的文件格式和文件后綴不同。程序中調用的庫有兩種 靜態庫和動態庫&#xff0c;不管是哪種庫文件本質是還是源文件&#xff0c;只不過是二進制格式只有計算機能夠識別&#xff0c;作為一…

【Node-RED 4.0.2】4.0版本新增特性(官方版)

二、重要功能 *1.時間戳格式改進 過去&#xff0c;node-red 只提供了 最原始的 timestamp 的格式&#xff08;1970-01-01 ~ now&#xff09; 但是現在&#xff0c;額外增加了 2 種格式&#xff1a; ISO 8601 -A COMMON FORMAT&#xff08;YYYY-MM-DDTHH:mm:ss:sssZ&#xff…

思考如何學習一門編程語言?

一、什么是編程語言 編程語言是一種用于編寫計算機程序的人工語言。通過編程語言&#xff0c;程序員可以向計算機發出指令&#xff0c;控制計算機執行各種任務和操作。編程語言由一組語法規則和語義規則組成&#xff0c;這些規則定義了如何編寫代碼以及代碼的含義。 編程語言…

linux和mysql基礎指令

Linux中nano和vim讀可以打開記事文件。 ifdown ens33 ifup ens33 關閉&#xff0c;開啟網絡 rm -r lesson1 gcc -o code1 code1.c 編譯c語言代碼 ./code1 執行c語言代碼 rm -r dir 刪除文件夾 mysql> show databases-> ^C mysql> show databases; -------…

常見網絡端口號

在網絡工程領域&#xff0c;了解和掌握默認端口號是至關重要的。端口號是計算機網絡中最基本的概念之 一&#xff0c;用于標識特定的網絡服務或應用程序。 1、什么是端口號&#xff1f; 端口號是計算機網絡中的一種標識&#xff0c;用于區分不同的網絡服務和應用程序。每個端…

【C++進階學習】第五彈——二叉搜索樹——二叉樹進階及set和map的鋪墊

二叉樹1&#xff1a;深入理解數據結構第一彈——二叉樹&#xff08;1&#xff09;——堆-CSDN博客 二叉樹2&#xff1a;深入理解數據結構第三彈——二叉樹&#xff08;3&#xff09;——二叉樹的基本結構與操作-CSDN博客 二叉樹3&#xff1a;深入理解數據結構第三彈——二叉樹…

想要打造超高性能的接口API?試試這12條小技巧。

1. 并行處理 簡要說明 舉個例子&#xff1a;在價格查詢鏈路中&#xff0c;我們需要獲取多種獨立的價格配置項信息&#xff0c;如基礎價、折扣價、商戶活動價、平臺活動價等等。 CompletableFuture 是銀彈嗎&#xff1f; 使用 CompletableFuture 的確能夠幫助我們解決許多獨…

走進IT的世界

引言 隨著高考的結束&#xff0c;對于即將踏入IT&#xff08;信息技術&#xff09;領域的新生而言&#xff0c;這個假期不僅是放松身心的時間&#xff0c;更是提前規劃、深化專業知識、為大學生活奠定堅實基礎的寶貴機會。以下是一份詳盡的高考假期預習與規劃指南&#xff0c;…

Android自動化測試實踐:uiautomator2 核心功能與應用指南

Android自動化測試實踐&#xff1a;uiautomator2 核心功能與應用指南 uiautomator2 是一個用于Android應用的自動化測試Python庫&#xff0c;支持多設備并行測試操作。它提供了豐富的API來模擬用戶對App的各種操作&#xff0c;如安裝、卸載、啟動、停止以及清除應用數據等。此外…

30個!2024重大科學問題、工程技術難題和產業技術問題發布

【SciencePub學術】中國科協自2018年開始&#xff0c;組織開展重大科技問題難題征集發布活動&#xff0c;引導廣大科技工作者緊跟世界科技發展大勢&#xff0c;聚焦國家重大需求&#xff0c;開展原創性、引領性研究&#xff0c;不斷夯實高質量發展的科技支撐。 自2024年征集活動…

飛書文檔轉markdown 超級快捷方法。

直接使用那個github的高贊官方的工具轉換&#xff0c;需要設置什么小應用那種東西&#xff0c;還要審批&#xff0c;社恐人表示怕了怕了。而且文檔我分享出去&#xff0c;是有權限的&#xff0c;反正無論如何生成不了 我的方法是 直接全選&#xff0c;然后粘貼進Arya - 在線 …

C#的五大設計原則-solid原則

什么是C#的五大設計原則&#xff0c;我們用人話來解釋一下&#xff0c;希望小伙伴們能學會&#xff1a; 好的&#xff0c;讓我們以一種幽默的方式來解釋C#的五大設計原則&#xff08;SOLID&#xff09;&#xff1a; 單一職責原則&#xff08;Single Responsibility Principle…

PCL 漸進形態過濾器實現地面分割

點云地面分割 一、代碼實現二、結果示例?? 概述 漸進形態過濾器:采用先腐蝕后膨脹的運算過程,可以有效濾除場景中的建筑物、植被、車輛、行人以及交通附屬設施,保留道路路面及路緣石點云。 一、代碼實現 #include <iostream> #include <pcl/io/pcd_io.h> #in…

【LeetCode】976. 三角形的最大周長

1. 題目 2. 分析 需要分析好再動手編程。 如果要構成三角形的最大周長&#xff0c;那么就需要盡可能用最長的邊構建。所以可以先對數組排個序&#xff0c;然后基于排序得到的結果從大往小的逐個檢查長度為3的窗口&#xff0c;判斷該窗口的值是否滿足三角形的構成條件&#x…

鴻蒙開發Ability Kit(程序訪問控制):【安全控件概述】

安全控件概述 安全控件是系統提供的一組系統實現的ArkUI組件&#xff0c;應用集成這類組件就可以實現在用戶點擊后自動授權&#xff0c;而無需彈窗授權。它們可以作為一種“特殊的按鈕”融入應用頁面&#xff0c;實現用戶點擊即許可的設計思路。 相較于動態申請權限的方式&am…

構造,析構,拷貝【類和對象(中)】

P. S.&#xff1a;以下代碼均在VS2019環境下測試&#xff0c;不代表所有編譯器均可通過。 P. S.&#xff1a;測試代碼均未展示頭文件stdio.h的聲明&#xff0c;使用時請自行添加。 博主主頁&#xff1a;LiUEEEEE ??????????????????? ?? …

Excel_VBA編程

在Excel中&#xff0c;VBA&#xff08;Visual Basic for Applications&#xff09;是一種強大的工具&#xff0c;可以用來自動化各種任務。下面介紹一些常用的VBA函數和程序結構&#xff1a; 常用函數 MsgBox&#xff1a;用于顯示消息框。 MsgBox "Hello, World!"In…

【python全棧系列】day07-python數據類型-集合

Python中的集合&#xff08;Set&#xff09;是一個無序的、不包含重復元素的數據結構。它主要用于數學上的集合操作&#xff0c;如并集、交集、差集和對稱差集等。集合的基本用途包括去重和關系測試。 1、集合的特性 無序性&#xff1a;集合中的元素是無序的&#xff0c;這意…

gin-vue -admin 初始化安裝后 進入 后臺首頁報錯

報錯原因&#xff1a; 因為 我是使用的phpstudy 小皮的數據庫 默認的是MySam 的引擎 mysql 引擎需要是 innoDB 解決辦法 &#xff1a; 在linux 的環境下 配置一個數據庫 &#xff0c; 我是用的是vmware 虛擬機

深入理解分布式搜索引擎 ElasticSearch,并能基于 ELK+Kafka 搭建分布式?志收集系統

Elasticsearch是一個基于Lucene的分布式、多租戶能力的全文搜索引擎。它提供了RESTful web接口和分布式多用戶能力的全文搜索引擎&#xff0c;基于Apache許可證發行。以下是對Elasticsearch的深入理解以及如何基于ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;加…