動態規劃【打家劫舍】

今天和大家分享一下動態規劃當中的打家劫舍題目,希望在大家刷題的時候提供一些思路

打家劫舍1:

題目鏈接:??198. 打家劫舍 - 力扣(LeetCode)

題目描述:

你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警

給定一個代表每個房屋存放金額的非負整數數組,計算你?不觸動警報裝置的情況下?,一夜之內能夠偷竊到的最高金額。

示例 1:

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

動規5部曲:

  1. 確定dp數組(dp table)以及下標的含義
  2. 確定遞推公式
  3. dp數組如何初始化
  4. 確定遍歷順序
  5. 舉例推導dp數組

dp數組的含義:

當前下標所對應的下標所對應的最大可以偷竊的金錢

確定遞推公式:

根據dp數組的含義可得,我們當前的金額最大值就是上一個房間可以偷竊的最大值和當前數值和上上一個房間可以偷竊的最大數值之和

dp數組如何初始化:

考慮最簡單的情況,假如只有一間房間,當前的dp[0]就是num[0],如果只有兩間房,那么當前的dp[0]為num[0],dp[1]為max(num[0],num[1])

確認遍歷順序:

只遍歷房間

舉例推導dp數組:

房子編號: ? ? 1 ? ?2 ? ?3 ? ?4 ? ?5
金額 (nums): ? 2 ? ?7 ? ?9 ? ?3 ? ?1

動態規劃過程 (dp):
dp[0] = 2 ? ? ? ? ? ? (偷第一個房子)
dp[1] = max(2, 7) = 7 (偷第二個房子)

dp[2] = max(7, 2+9) = 11
dp[3] = max(11, 7+3) = 11
dp[4] = max(11, 11+1) = 12

最終最大金額: dp[4] = 12

假設數組為num,那么dp[0]為num[0],dp[1]為max(num[0],num[1]),通過遍歷我們的房屋,那么就可以得到dp[i]=max(dp[i-1],dp[i]+dp[i-2])

思維講解:

?詳細了解dp數組的含義,我們這里每次dp取到的都是當前房間和前面房間可以偷竊的金錢最大數,所以當前dp值就是上一個dp或者num[i]+dp[i-2]?,從而通過遍歷房間得到我們的dp

代碼:

int rob(vector<int>& nums) {vector<int> dp(nums.size() + 1, 0);if(nums.size()<2) return nums[0];dp[0] = nums[0];dp[1] = max(nums[0],nums[1]);for (int i = 2; i < nums.size(); i++) {dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);}return dp[nums.size()-1];}
打家劫舍2:

題目鏈接:?213. 打家劫舍 II - 力扣(LeetCode)

題目描述:

你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都?圍成一圈?,這意味著第一個房屋和最后一個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警?。

給定一個代表每個房屋存放金額的非負整數數組,計算你?在不觸動警報裝置的情況下?,今晚能夠偷竊到的最高金額。

示例 2:

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

?這個題目比前面的那個多了一個條件,就是房屋是一個環形的房間,那么這個題目怎么解決呢,如何進行初始化呢,選上第一個就不能選上最后一個,如何解決這個問題呢

因為這是一個環形房間,從哪里開始都一樣,我們可以將房間分為兩組,第一組就是從第一個房間到倒數第二個房間,然后第二組就是第二個房間到倒數第一個房間,然后得出這兩組所求的最大金額,返回的就是兩組當中最大金額的最大值,第幾個到第幾個的房間偷取的最大金錢數和打家劫舍1情況相同

為什么要這樣想呢????

因為這里有兩種情況:

1. 不偷最后一個房子

假設我們從第一個房子開始偷,這樣就不需要考慮偷最后一個房子,因為它與第一個房子相鄰。因此,問題就簡化為一個普通的“打家劫舍”問題,即我們從第 1 個房子到第 n-1 個房子之間選擇哪些房子偷。這個問題可以通過動態規劃來解決。

2. 不偷第一個房子

假設我們從第二個房子開始偷,這樣就不需要考慮偷第一個房子,因為它與第二個房子相鄰。因此,這樣的問題就變成了從第 2 個房子到第 n 個房子之間選擇偷哪些房子。同樣可以通過動態規劃來解決。

?

?

最后通過比較11打于10所以選11,所能偷竊的最大金額為11?

代碼:

class Solution {
public:int rob(vector<int>& nums) {if (nums.size() == 0)return 0;if (nums.size() == 1)return nums[0];if (nums.size() == 2)return max(nums[0], nums[1]);vector<int> dp1(nums.size(), 0);vector<int> dp2(nums.size(), 0);dp1[0] = nums[0];dp1[1] = max(nums[0], nums[1]);dp2[1] = nums[1];dp2[2] = max(nums[1], nums[2]);for (int i = 2; i < nums.size() - 1; i++) {dp1[i] = max(dp1[i - 2] + nums[i], dp1[i - 1]);}for (int i = 3; i < nums.size(); i++) {dp2[i] = max(dp2[i - 2] + nums[i], dp2[i - 1]);}return max(dp1[nums.size() - 2], dp2[nums.size() - 1]);}
};

?后面會繼續補充的,感謝觀看

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

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

相關文章

KVM創建ubuntu20.04虛機,部署K8S,再克隆出二份,做為Worker節點加入集群,通過Helm創建2個Pod,讓它們之間通過域名互訪

KVM創建ubuntu20.04虛機,部署K8S,再克隆出二份,做為Worker節點加入集群,通過Helm創建2個Pod,讓它們之間通過域名互訪 一.背景二.操作步驟1.安裝KVMA.在BIOS中開啟VT-dB.修改grub,開啟iommu在/etc/default/grub 中 GRUB_CMDLINE_LINUX行 添加 intel_iommuon iommupt重新創建引導…

【機器學習實戰入門項目】使用Python創建自己的表情符號

深度學習項目入門——讓你更接近數據科學的夢想 表情符號或頭像是表示非語言暗示的方式。這些暗示已成為在線聊天、產品評論、品牌情感等的重要組成部分。這也促使數據科學領域越來越多的研究致力于表情驅動的故事講述。 隨著計算機視覺和深度學習的進步&#xff0c;現在可以…

BEVFusion論文閱讀

1. 簡介 融合激光雷達和相機的信息已經變成了3D目標檢測的一個標準&#xff0c;當前的方法依賴于激光雷達傳感器的點云作為查詢&#xff0c;以利用圖像空間的特征。然而&#xff0c;人們發現&#xff0c;這種基本假設使得當前的融合框架無法在發生 LiDAR 故障時做出任何預測&a…

OSI七層協議——分層網絡協議

OSI七層協議&#xff0c;顧名思義&#xff0c;分為七層&#xff0c;實際上七層是不存在的&#xff0c;是人為的進行劃分,讓人更好的理解 七層協議包括&#xff0c;物理層(我),數據鏈路層(據),網絡層(網),傳輸層(傳輸),會話層(會),表示層(表),應用層(用)(記憶口訣->我會用表…

6. NLP自然語言處理(Natural Language Processing)

自然語言是指人類日常使用的語言&#xff0c;如中文、英語、法語等。 自然語言處理是人工智能&#xff08;AI&#xff09;領域中的一個重要分支&#xff0c;它結合了計算機科學、語言學和統計學的方法&#xff0c;通過算法對文本和語音進行分析&#xff0c;使計算機能夠理解、解…

Ubuntu使用指南

Ubuntu使用指南 一、Ubuntu虛擬機1、本地如何連接虛擬機&#xff0c;并設置虛擬機可以訪問外網 一、Ubuntu虛擬機 1、本地如何連接虛擬機&#xff0c;并設置虛擬機可以訪問外網 本地&#xff1a;WMware設置為橋接模式&#xff08;此時虛擬機可以看作一臺獨立主機&#xff09;…

【Mysql進階知識】Mysql 程序的介紹、選項在命令行配置文件的使用、選項在配置文件中的語法

目錄 一、程序介紹 二、mysqld--mysql服務器介紹 三、mysql - MySQL 命令行客戶端 3.1 客戶端介紹 3.2 mysql 客戶端選項 指定選項的方式 mysql 客戶端命令常用選項 在命令行中使用選項 選項(配置)文件 使用方法 選項文件位置及加載順序 選項文件語法 使用舉例&am…

wireshark抓路由器上的包 抓包路由器數據

文字目錄 抓包流程概述設置抓包配置選項 設置信道設置無線數據包加密信息設置MAC地址過濾器 抓取聯網過程 抓包流程概述 使用Omnipeek軟件分析網絡數據包的流程大概可以分為以下幾個步驟&#xff1a; 掃描路由器信息&#xff0c;確定抓包信道&#xff1b;設置連接路由器的…

【藍橋杯】43687.贏球票

題目描述 某機構舉辦球票大獎賽。獲獎選手有機會贏得若干張球票。 主持人拿出 N 張卡片&#xff08;上面寫著 1?N 的數字&#xff09;&#xff0c;打亂順序&#xff0c;排成一個圓圈。 你可以從任意一張卡片開始順時針數數: 1,2,3 ? ? 如果數到的數字剛好和卡片上的數字…

SQL-leetcode—626. 換座位

626. 換座位 表: Seat -------------------- | Column Name | Type | -------------------- | id | int | | student | varchar | -------------------- id 是該表的主鍵&#xff08;唯一值&#xff09;列。 該表的每一行都表示學生的姓名和 ID。 ID 序列始終從 1 開始并連續…

微軟開源AI Agent AutoGen 詳解

AutoGen是微軟發布的一個用于構建AI Agent系統的開源框架,旨在簡化事件驅動、分布式、可擴展和彈性Agent應用程序的創建過程。 開源地址: GitHub - microsoft/autogen: A programming framework for agentic AI ?? PyPi: autogen-agentchat Discord: https://aka.ms/auto…

【Elasticsearch】全文搜索與相關性排序

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

用css和html制作太極圖

目錄 css相關參數介紹 邊距 邊框 偽元素選擇器 太極圖案例實現、 代碼 效果 css相關參數介紹 邊距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …

【React】插槽渲染機制

目錄 通過 children 屬性結合條件渲染通過 children 和 slot 屬性實現具名插槽通過 props 實現具名插槽 在 React 中&#xff0c;并沒有直接類似于 Vue 中的“插槽”機制&#xff08;slot&#xff09;。但是&#xff0c;React 可以通過 props和 children 來實現類似插槽的功能…

【Go】Go Gorm 詳解

1. 概念 Gorm 官網&#xff1a;https://gorm.io/zh_CN/docs/ Gorm&#xff1a;The fantastic ORM library for Golang aims to be developer friendly&#xff0c;這是官網的介紹&#xff0c;簡單來說 Gorm 就是一款高性能的 Golang ORM 庫&#xff0c;便于開發人員提高效率 那…

【MySQL實戰】mysql_exporter+Prometheus+Grafana

要在Prometheus和Grafana中監控MySQL數據庫&#xff0c;如下圖&#xff1a; 可以使用mysql_exporter。 以下是一些步驟來設置和配置這個監控環境&#xff1a; 1. 安裝和配置Prometheus&#xff1a; - 下載和安裝Prometheus。 - 在prometheus.yml中配置MySQL通過添加以下內…

【Apache Doris】周FAQ集錦:第 29 期

引言 歡迎查閱本周的 Apache Doris 社區 FAQ 欄目&#xff01; 在這個欄目中&#xff0c;每周將篩選社區反饋的熱門問題和話題&#xff0c;重點回答并進行深入探討。旨在為廣大用戶和開發者分享有關 Apache Doris 的常見問題。 通過這個每周 FAQ 欄目&#xff0c;希望幫助社…

Linux:文件描述符fd、系統調用open

目錄 一、文件基礎認識 二、C語言操作文件的接口 1.> 和 >> 2.理解“當前路徑” 三、相關系統調用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基礎認識 文件 內容 屬性。換句話說&#xff0c;如果在電腦上新建了一個空白文檔&#xff0…

鴻蒙動態路由實現方案

背景 隨著CSDN 鴻蒙APP 業務功能的增加&#xff0c;以及為了與iOS、Android 端統一頁面跳轉路由&#xff0c;以及動態下發路由鏈接&#xff0c;路由重定向等功能。鴻蒙動態路由方案的實現迫在眉睫。 實現方案 鴻蒙版本動態路由的實現原理&#xff0c;類似于 iOS與Android的實…

計算機網絡 (42)遠程終端協議TELNET

前言 Telnet&#xff08;Telecommunication Network Protocol&#xff09;是一種網絡協議&#xff0c;屬于TCP/IP協議族&#xff0c;主要用于提供遠程登錄服務。 一、概述 Telnet協議是一種遠程終端協議&#xff0c;它允許用戶通過終端仿真器連接到遠程主機&#xff0c;并在遠程…