【數據結構與算法】動態規劃法解題20240302

在這里插入圖片描述


這里寫目錄標題

  • 一、198. 打家劫舍
    • 1、動態規劃五部曲
  • 二、213. 打家劫舍 II

一、198. 打家劫舍

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

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

在這里插入圖片描述

1、動態規劃五部曲

1、確定dp數組(dp table)以及下標的含義
dp[i]:考慮下標i(包括i)以內的房屋,最多可以偷竊的金額為dp[i]。

2、確定遞推公式
決定dp[i]的因素就是第i房間偷還是不偷。
如果偷第i房間,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考慮的,找出 下標i-2(包括i-2)以內的房屋,最多可以偷竊的金額為dp[i-2] 加上第i房間偷到的錢。
如果不偷第i房間,那么dp[i] = dp[i - 1],即考 慮i-1房,(注意這里是考慮,并不是一定要偷i-1房,這是很多同學容易混淆的點)
然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);

3、dp數組如何初始化
從遞推公式dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);可以看出,遞推公式的基礎就是dp[0] 和 dp[1]
從dp[i]的定義上來講,dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1]);

# 3、數組初始化
dp[0] = nums[0]
dp[1] = max(nums[0], nums[1])

4、確定遍歷順序
dp[i] 是根據dp[i - 2] 和 dp[i - 1] 推導出來的,那么一定是從前到后遍歷!

class S198:def func(self, nums):# 1、創建dp數組,dp[i]:到達下標為i的位置偷竊的最大金額dp = [0] * (len(nums))# 3、數組初始化dp[0] = nums[0]dp[1] = max(nums[0], nums[1])# 4、確定遍歷順序for i in range(2, len(nums)):# 2、確定遞推公式dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])print(dp)return dp[-1]r = S198()
nums = [2, 7, 9, 3, 1]
print(r.func(nums))

二、213. 打家劫舍 II

中等

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

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

在這里插入圖片描述
對于一個數組,成環的話主要有如下三種情況:
情況一:考慮不包含首尾元素
在這里插入圖片描述
情況二:考慮包含首元素,不包含尾元素
在這里插入圖片描述
情況三:考慮包含尾元素,不包含首元素
在這里插入圖片描述
注意我這里用的是"考慮",例如情況三,雖然是考慮包含尾元素,但不一定要選尾部元素! 對于情況三,取nums[1] 和 nums[3]就是最大的。

而情況二 和 情況三 都包含了情況一了,所以只考慮情況二和情況三就可以了。

class S213:def func(self, nums):if not nums:return 0if len(nums) <= 2:return max(nums)# 1、創建dp數組,明確dp數組的含義,之前房間到i時偷的最大金幣為dp[i]dp = [0] * len(nums)# dp[i]:含義 第i個數偷的最高金額# todo 搶第一個房間,不搶最后一個房間dp[0] = nums[0]dp[1] = max(nums[0], nums[1])for i in range(2, len(nums) - 1):# 2、確定遞推公式dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])res1 = dp[-2]print(dp)  # [1, 2, 4, 0]dp1 = [0] * len(nums)# todo 不搶第一個房間,搶最后一個房間dp1[0] = 0dp1[1] = nums[1]dp1[2] = max(nums[1], nums[2])for i in range(3, len(nums)):# 2、確定遞推公式dp1[i] = max(dp1[i - 2] + nums[i], dp1[i - 1])res2 = dp1[-1]print(dp1)  # [0, 2, 3, 3]return max(res1, res2)r = S213()
nums = [1, 2, 3, 1]
print(r.func(nums))

在這里插入圖片描述

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

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

相關文章

速盾:使用cdn后速度慢是怎么回事?

CDN&#xff08;內容分發網絡&#xff09;是一種通過將網站的靜態內容分布到全球各地的服務器&#xff0c;從而提供更快速度和更好用戶體驗的技術。然而&#xff0c;有時候用戶會遇到使用CDN后速度變慢的問題&#xff0c;下面將探討幾種可能的原因。 服務器選擇錯誤: CDN服務通…

【python】雙十一美妝數據分析可視化 [聚類分析/線性回歸/支持向量機](代碼+報告)【獨一無二】

&#x1f449;博__主&#x1f448;&#xff1a;米碼收割機 &#x1f449;技__能&#x1f448;&#xff1a;C/Python語言 &#x1f449;公眾號&#x1f448;&#xff1a;測試開發自動化【獲取源碼商業合作】 &#x1f449;榮__譽&#x1f448;&#xff1a;阿里云博客專家博主、5…

全量知識系統問題及SmartChat給出的答復 之11 三套工具之6語法解析器之4

Q30. 原Q24.問題的錯誤糾正 我剛剛檢查了 之前的問題&#xff0c;Q24 中有明顯的錯誤。Q24 的提問是&#xff1a; “請設計一個IPP&#xff08; Integrated Partial Parser&#xff09;解析器&#xff0c;能分別基于上述兩種文法規則&#xff0c;用于分析有關某領域的一些新聞…

【JavaSE】 P165 ~ P194 抽象方法,抽象類,接口,接口內容,多接口實現和父類繼承,多態,向上轉型,向下轉型

目錄 抽象抽象的概念抽象方法和抽象類的格式抽象方法和抽象類的使用抽象方法和抽象類的注意事項● 練習1. 寫一個父類圖形類&#xff0c;其中有方法&#xff0c;功能計算面積為抽象方法。2. 抽象類繼承。判斷對錯,沒錯的分析運行結果3. 發紅包,群內用戶類作為父類&#xff0c;有…

c++相對路徑與絕對路徑

參考:https://blog.csdn.net/weixin_42175509/article/details/114360938 1、獲取當前路徑&#xff1a;用getcwd()函數&#xff0c;返回值是一個指向字符串的指針 2、相對路徑用正斜杠“/” ./&#xff0c;表示當前路徑&#xff1b;…/表示當前路徑的上一級路徑&#xff1b;…

NX二次開發:ListingWindow窗口的應用

一、概述 在NX二次開發的學習中&#xff0c;瀏覽博客時發現看到[社恐貓]和[王牌飛行員_里海]這兩篇博客中寫道有關信息窗口內容的打印和將窗口內容保存為txt,個人人為在二次開發項目很有必要&#xff0c;因此做以下記錄。 ListingWindow信息窗口發送信息四種位置類型 設置Listi…

鴻蒙系統的開發與學習:一、安裝工具與處理報錯

前言&#xff1a; 鴻蒙系統的學習與記錄。 1 、使用開發工具&#xff1a;deveco-studio 1&#xff09;這個是工具的安裝 2&#xff09;這個是工具包&#xff0c;里面包含了 obpm&#xff0c;如果你裝不上這個&#xff0c;可以使用工具包內部的 2、安裝 官方安裝教程&#xff…

前端學習第三天-css基礎

1. CSS簡介 從HTML被發明開始&#xff0c;樣式就以各種形式存在。不同的瀏覽器結合它們各自的樣式語言為用戶提供頁面效果的控制。最初的HTML只包含很少的顯示屬性。 隨著HTML的成長&#xff0c;為了滿足頁面設計者的要求&#xff0c;HTML添加了很多顯示功能。但是隨著這些功能…

面經(五)南京 軟通動力 一面

注&#xff1a;已經有了接近一年的工作經驗 總體評價 不完全是技術面&#xff0c;面試經過還行&#xff0c;但可能是期望崗位和對方需求不太一致&#xff0c;感覺不太好過 面試經過 HR找你&#xff0c;發簡歷入庫&#xff0c;然后商量面試時間&#xff0c;發騰訊會議鏈接騰…

USB4之ASM2464PD與ASM2464PDX兼容與運用

首先在NVMe上運用: 一&#xff1a;ASM2464PD&#xff08;現在可以做帶PD的方案&#xff09; 二&#xff1a;ASM2464PDX 1&#xff1a; Application Guide- CFX card reader NVMe SSD 2&#xff1a;ASM2464PDX Application Guide- NVMe SSD x4 with data clone 三&#xff…

C習題003:球筐投球(一排)

題目 輸入樣例 在這里給出一組輸入。例如&#xff1a; 5 3 7 5 7 7 3 1 5 3 1 5 2 4 4 4輸出樣例 在這里給出相應的輸出。例如&#xff1a; 12 10 12 16 8代碼長度限制 16 KB 時間限制400 ms 內存限制 64 MB 棧限制 8192 KB 代碼 #include<stdio.h> int main() {int…

計算機2級考試26

一、選擇題&#xff08;本題共20道小題&#xff0c;共40分。&#xff09; 1. 表示關系x≤y≤z的c語言表達式為 A) (X<Y)&&(Y<Z) B) (X<Y)AND(Y<Z) C) (X<Y<Z) D) (X<Y)&(Y<Z) 2. 以下程序的輸出結果是 main( ) { int a12&#xff…

新一代湖倉集存儲,多模型統一架構,高效挖掘數據價值

星環科技TDH一直致力于給用戶帶來高性能、高可靠的一站式大數據基礎平臺&#xff0c;滿足對海量數據的存儲和復雜業務的處理需求。 同時在易用性方面持續深耕&#xff0c;降低用戶開發和運維成本&#xff0c;讓數據處理平民化&#xff0c;助力用戶以更便捷、高效的方式去挖掘數…

[多媒體服務器] 通過nginx搭建 rtmp/hls/dash 媒體服務器,支持點播和直播

參考&#xff1a; How To Set Up a Video Streaming Server using Nginx-RTMP on Ubuntu 20.04 | DigitalOcean 用到的工具&#xff1a; nginx&#xff0c;nginx rtmp插件&#xff0c;OBS&#xff0c;ffmpeg&#xff0c;ubuntu&#xff0c;youtube-dl Step1&#xff1a;安裝和…

jmeter如何請求訪問https接口

添加線程組http請求 新建線程組&#xff0c;添加http請求 填入協議&#xff0c;ip&#xff0c;端口&#xff0c;請求類型&#xff0c;路徑&#xff0c;以及請求參數&#xff0c;查看結果樹等。 然后最關鍵的一步來了。 導入證書 步驟&#xff1a;獲取證書&#xff0c;重新生…

基于SSM的高校競賽和考級查詢系統(有報告)。Javaee項目。ssm項目。

演示視頻&#xff1a; 基于SSM的高校競賽和考級查詢系統&#xff08;有報告&#xff09;。Javaee項目。ssm項目。 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三層體系結構&#xff0c;通過Sp…

Java中的動態代理與Spring AOP編程

第一章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;在Java里&#xff0c;動態代理和Spring AOP&#xff08;面向切面編程&#xff09;是兩個能讓代碼更加靈活、更加干凈的強大工具。作為一名Java程序員&#xff0c;小黑覺得掌握它們對于寫出高質量的代碼來說非常…

Property ‘glob‘ does not exist on type ‘ImportMeta‘

參考文章&#xff1a; vite導入文件&#xff0c;Property ‘globEager‘ does not exist on type ‘ImportMeta‘

通過GitHub探索Python爬蟲技術

1.檢索爬取內容案例。 2.找到最近更新的。(最新一般都可以直接運行) 3.選擇適合自己的項目&#xff0c;目前測試下面畫紅圈的是可行的。 4.方便大家查看就把代碼粘貼出來了。 #圖中畫圈一代碼 import requests import os import rewhile True:music_id input("請輸入歌曲…