7 動態規劃

下面的例子不錯:?對于動態規劃,能學到不少東西;

你要清楚每一步都在做什么,劃分細致就能夠拆解清楚!

?xk. - 力扣(LeetCode)

labuladong的算法筆記-動態規劃-CSDN博客

動態規劃是一種強大的算法設計策略,用于解決具有重疊子問題和最優子結構特點的問題。在面對動態規劃類題目時,遵循以下步驟可以幫助你系統地解決問題:

1. 定義狀態

  • 確定變量:識別哪些變量會影響問題的解。例如,在背包問題中,關鍵變量可能是物品的重量和價值,以及剩余的背包容量。
  • 狀態表示:用這些變量定義狀態。例如,dp[i][w]?可能表示前i個物品放入容量為w的背包所能獲得的最大價值。

2. 狀態轉移方程

  • 建立關系:找到狀態之間的關系,即如何從一個狀態轉移到另一個狀態。這通常涉及到一個遞推公式。例如,在斐波那契數列中,F(n) = F(n-1) + F(n-2)
  • 邊界條件:確定遞推公式的起始狀態,通常是最簡單的情況,例如?dp[0][w] = 0(背包問題中沒有物品時的價值)。

3. 選擇方向

  • 自底向上:從最簡單的狀態開始,逐步構建更復雜的狀態。這種方法通常使用循環實現,避免了重復計算。
  • 自頂向下:從復雜的狀態開始,遞歸地解決子問題。這種方法通常使用遞歸和記憶化(memoization)來避免重復計算。

4. 初始化

  • 初始狀態:根據問題的性質初始化DP數組。例如,所有狀態初始化為0或無窮大。

5. 計算

  • 填充DP表:根據狀態轉移方程填充DP表或數組。確保按正確的順序填充,以便在計算每個狀態時,所需的前驅狀態已經被計算。

6. 返回結果

  • 解析答案:DP過程完成后,根據問題要求解析出最終答案。這可能是DP表中的某個特定值,也可能是回溯整個DP過程找到最優解的具體方案。

7. 復雜度分析

  • 時間復雜度:通常由狀態的數量和狀態轉移的復雜度決定。
  • 空間復雜度:由存儲狀態所需的空間決定,可以通過滾動數組等方式優化空間復雜度。

1 70. 爬樓梯

假設你正在爬樓梯。需要?n?階你才能到達樓頂。

每次你可以爬?1?或?2?個臺階。你有多少種不同的方法可以爬到樓頂呢?

示例 1:

輸入:n = 2
輸出:2
解釋:有兩種方法可以爬到樓頂。
1. 1 階 + 1 階
2. 2 階

這是一個簡單的動態規劃的問題:

分解問題:不積硅步無以至千里!

假設:當前到了第x層,并且小于x層的走法f(x)我們都知道。

那么后面如何求呢?

  1. 第一個階梯、第二個階梯都是1下就能走到!
  2. y = x+1,那么 f(y) = f(y-1) + f(y-2), 想要上到第y步, 一定是從前面階梯走過來的。

class Solution:def climbStairs(self, n: int) -> int:dp = [1] * (n+1)for i in range(2,n+1):dp[i] = dp[i-1] + dp[i-2]#print(dp)return dp[n]

2?198. 打家劫舍?

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

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

相鄰不能同時偷!

示例 1:

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

在做這一個題目的時候:

f(x):?到第x個房間能得到的最大收益;

我也是設定:加入到了第X個房間,那么之前的狀態(到房間能得到的最大收益)我都是知道的。所以,f(X+1) 怎么做才能最大呢?

怎么能偷到x+1個房子,由x-1過來的,x-2過來的(開始我沒考慮到這點)。

class Solution:def rob(self, nums: List[int]) -> int:dp = nums[::]for i in range(2,len(nums)):temp = dp[i-2]if i-3>=0:temp = max(temp,dp[i-3])dp[i] = temp + nums[i]return max(dp)

3?322. 零錢兌換

給你一個整數數組?coins?,表示不同面額的硬幣;以及一個整數?amount?,表示總金額。

計算并返回可以湊成總金額所需的?最少的硬幣個數?。如果沒有任何一種硬幣組合能組成總金額,返回?-1?。

你可以認為每種硬幣的數量是無限的。

示例?1:

輸入:coins = [1, 2, 5], amount = 11
輸出:3 
解釋:11 = 5 + 5 + 1
  1. 遞歸;
  2. 動態規劃;

有硬幣:【q,w,e】

思想:?

比如7個硬幣怎么使用最少的硬幣進行組合呢?

f(7) = min(f(7-q),f(7-w),f(7-e)) + 1

還有個特殊條件:?f(7-q),f(7-w),f(7-e) 存在組合(基石,不然無法站住腳);

我這個思路不是特征的好。

class Solution:def coinChange(self, coins: List[int], amount: int) -> int:if amount==0:return 0 coins = sorted(coins)dp = [0] * (amount+1)for i in range(amount+1):for coin in coins:if i-coin==0:dp[i] = 1elif i-coin>0:if dp[i]==0:# if dp[i-coin]==0:dp[i]==0else:dp[i] = dp[i-coin] + 1 #min(, dp[i])else:if dp[i-coin]==0:dp[i]==0else:dp[i] = min(dp[i-coin] + 1, dp[i])else:breakprint(dp)return -1 if dp[amount]==0 else dp[amount]# def sub_x(amount):#     if amount==0:#         return 0#     if amount < 0 or amount<coins[0]:#         return -1#     temp = -1#     for coin in coins:#         x = sub_x(amount - coin) # -1, >=0#         if x == -1:#             continue#         if temp==-1:#             temp = x+1#         else:#             temp = min(x+1, temp)#     return tempreturn sub_x(amount)

思路二?:陳奕迅的背包

class Solution:def coinChange(self, coins: List[int], amount: int) -> int:n = len(coins)dp = [[amount+1] * (amount+1) for _ in range(n+1)]    # 初始化為一個較大的值,如 +inf 或 amount+1# 合法的初始化dp[0][0] = 0    # 其他 dp[0][j]均不合法# 完全背包:套用0-1背包【遍歷硬幣數目k】for i in range(1, n+1):                     # 第一層循環:遍歷硬幣for j in range(amount+1):               # 第二層循環:遍歷背包for k in range(j//coins[i-1]+1):    # 第三層循環:當前硬幣coin取k個 (k*coin<=amount)dp[i][j] = min( dp[i][j], dp[i-1][j-k*coins[i-1]] + k )ans = dp[n][amount] return ans if ans != amount+1 else -1

?思想:

  1. dp[i][j]: 使用i個硬幣拼成J元最小個數;
  2. 如何判斷是否放入第i+1 個硬幣呢? 當前的容量不足以滿足硬幣金額,那么最好的揭發就是dp[i-1][j], 最好的解決策略在之前。?當前的容量>金額: 有操作的空間, min(放入+1,不放入)
class Solution:def coinChange(self, coins: List[int], amount: int) -> int:# 11 [1,2,5]coin_len = len(coins)dp = [[amount+1]*(amount+1) for _ in range(coin_len+1)]#coins = sorted(coins)# 多大空間dp[0][0] = 0for i in range(1,coin_len+1):for j in range(amount+1):coin = coins[i-1]if j < coin:dp[i][j] = dp[i-1][j]else:dp[i][j] = min(dp[i-1][j], dp[i][j-coin]+1)# for j in range(1, coin_len+1):#     coin = coins[j-1]#     for i in range(amount+1):#         # 當前能夠到達的最大距離#         for x in range(i//coin+1):#             dp[j][i] = min(dp[j][i], dp[j-1][i-coin*x]+x)#print(dp)return -1 if dp[coin_len][amount]==(amount+1) else dp[coin_len][amount]

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

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

相關文章

【計算機視覺系列實戰教程 (實戰03)】:提取兩點之間的邊緣點

1、目的 圖像中任意兩點&#xff08;起點到終點&#xff09;之間&#xff0c;提取由深色到淺色&#xff08;或由淺色到深色&#xff09;的第一個邊緣點。這樣有利于精確地提取指定區域內的圖像邊緣。 經實踐證明&#xff1a;本算法能夠有效地定位兩點之間的邊緣信息&#xff0c…

Rethinking Federated Learning with Domain Shift: A Prototype View

CVPR2023,針對分布式數據來自不同的域時,私有模型在其他域上表現出退化性能(具有域轉移)的問題。提出用于域轉移下聯邦學習的聯邦原型學習(FPL)。核心思想是構建集群原型和無偏原型,提供富有成效的領域知識和公平的收斂目標。將樣本嵌入拉近到屬于相同語義的集群原型,而…

AI繪畫工具:藝術與技術的交響曲

AI繪畫工具&#xff1a;藝術與技術的交響曲 引言 在數字化浪潮的推動下&#xff0c;藝術創作正經歷著前所未有的變革。AI繪畫工具&#xff0c;作為藝術與科技結合的產物&#xff0c;正以其獨特的方式重塑著藝術的邊界。 一、AI繪畫工具的發展歷程 AI繪畫工具從早期的簡單圖…

@react-google-maps/api實現谷歌地圖嵌入React項目中,并且做到點擊地圖任意一處,獲得它的經緯度

1.第一步要加入項目package.json中或者直接yarn install它都可以 "react-google-maps/api": "^2.19.3",2.加入項目中 import AMapLoader from amap/amap-jsapi-loader;import React, { PureComponent } from react; import { GoogleMap, LoadScript, Mar…

【有哪些GPU算力租用平臺值得推薦】

&#x1f308;個人主頁: 程序員不想敲代碼啊 &#x1f3c6;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f44d;點贊?評論?收藏 &#x1f91d;希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出指正&#xff0c;讓我們共…

徒手繪制 Android 通用進度條

拖動條&#xff08;FlexSeekBar&#xff09;&#xff0c;在Android的各個地方都非常常用&#xff0c;本文旨在自研一套通用的進度條&#xff0c;非常適合車載App使用 樣式如下&#xff1a; 使用示例 <!--默認用法--> <com.max.android.ui.seekbar.FlexSeekBarandroi…

10-linux生信快捷鍵

tab#補全命令/地址 #只需要鍵入/home/r 然后呢tab鍵即可 root@iZbp1ajgi9pp0204trc1gzZ:~# /home/rtest/↑↓#翻越歷史命令 ctrl+A#將光標移動到命令行開頭(進行命令補全) ctrl+E#將光標移動到命令行結尾(進行命令添加) ctrl+C#強制終止當前命令 Ctrl+Z#暫停當前任務

【test】小愛同學通過esp32控制電腦開關

文章目錄 一、環境準備二、開關機原理數據傳輸框架 三、環境搭建1.巴法云平臺設置2.米家設置3.windows網絡喚醒設置4.搭建esp32開發環境并部署&#xff08;1&#xff09;新建項目&#xff08;2&#xff09;導入esp32庫&#xff08;3&#xff09; 添加庫&#xff08;4&#xff0…

fluwx插件實現微信支付

Flutter開發使用fluwx插件實現微信支付&#xff0c;代碼量不多&#xff0c;復雜的是安卓和iOS的各種配置。 在 pubspec.yaml 文件中添加fluwx依賴 fluwx: ^4.5.5 使用方法 通過fluwx注冊微信Api await Fluwx().registerApi(appId: wxea7a1c53d9e5849d, universalLink: htt…

基于SpringBoot的大學生租房系統

該系統主要實現了用戶和房主通過系統注冊用戶&#xff0c;登錄系統后能夠編輯自己的個人信息、查看首頁&#xff0c;房屋信息&#xff0c;房屋評價&#xff0c;公告資訊&#xff0c;個人中心&#xff0c;后臺管理&#xff0c;意見反饋等&#xff0c;還可以對后臺進行操作&#…

2024年顯著性檢測部分論文及代碼匯總(3)

ICML Size-invariance Matters: Rethinking Metrics and Losses for Imbalanced Multi-object Salient Object Detection code Abstacrt&#xff1a;本文探討了顯著性檢測中評價指標的尺寸不變性&#xff0c;尤其是當圖像中存在多個大小不同的目標時。作者觀察到&#xff0c;…

Pip換源,以及python解耦方法實現

一、 Pip換源 可以查看文章路徑 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy二、 解耦 1.解耦思想 具體查看文章python解耦重構&#xff0c;提高程序維護性 https://editor.csdn.net/md/?articleId140161169 mysql 連接解耦 主要實現方式為mysql配置項…

vue中總線機制(EventBus) EventBus作為所有組件共享的事件中心

一、EventBus的簡介 EventBus 又稱時間總線 &#xff0c;理解上來講 EventBus 機制是通知的概念&#xff0c;EventBus作為所有組件共享的事件中心&#xff0c;既可以發送事件也可以接受事件&#xff0c;所有組件都可以平行的接到到相對應的數據。 新建一個js文件 // EventBus…

雙指針算法:快速排序模擬實現

目錄 1.思路解析 2&#xff1a;代碼展示 1.思路解析 使用雙指針pre和cur 指針cur用于檢測符合條件的數據 cur和pre數據發生交換用于將符合條件的數據&#xff08;比key小&#xff09;向左扔 一輪循環結束時&#xff0c;以pre為分界點&#xff0c;除去key&#xff0c;pre左邊的…

物聯網IOT,講的什么?

想象一下,當你早晨醒來,智能咖啡機已經根據你的習慣準備好了香濃的咖啡;家中的溫度自動調節至最舒適的狀態;出門前,智能冰箱提醒你哪些食材需要補充……這些場景不再是科幻電影里的虛構,而是物聯網技術為我們帶來的現實便利。 物聯網的概念與起源 物聯網,顧名思義,是指…

SpringBoot項目,配置文件pom.xml的結構解析

pom.xml 是 Maven 項目對象模型&#xff08;Project Object Model&#xff09;的配置文件&#xff0c;它定義了 Maven 項目的基本設置和構建過程。以下是 pom.xml 文件的基本結構和一些常見元素的解析&#xff1a; 項目聲明 (<project>): <modelVersion>: 通常設置…

1.HI3559AV100 官方開發板sample運行

1.內核、文件系統部分 有關uboot&#xff0c;kernel&#xff0c;rootfs部分就不贅述&#xff0c;直接在SDK提供的鏡像文件進行燒錄即可。2.編譯MPP下的sample運行 實驗前準備&#xff1a;通過NFS方式掛載到開發板與主機通信傳輸文件 驅動和庫的部署&#xff1a;把MPP目錄下的…

單例模式詳解:概念與實用技巧

目錄 單例模式單例模式結構單例模式適用場景單例模式優缺點練手題目題目描述輸入描述輸出描述輸入示例輸出示例提示信息題解 單例模式 單例模式是一種創建型設計模式&#xff0c; 讓你能夠保證一個類只有一個實例&#xff0c; 并提供一個訪問該實例的全局節點。 只有一個實例的…

阿里巴巴店鋪電話采集軟件操作步驟解析

以下是一個簡單的程序&#xff0c;用于訪問1688店鋪并獲取店鋪信息&#xff1a; import requestsdef get_store_info(store_id):# 構建請求URLurl fhttps://detail.1688.com/offer/{store_id}.html# 發送GET請求response requests.get(url)# 如果請求成功if response.status…

震驚!運氣竟能如此放大!運氣的驚人作用,你了解嗎?

芒格&#xff1a;得到你想要的東西&#xff0c;最保險的辦法&#xff0c;就是讓自己配得上你想要的那個東西。今天仔細想了想這句話&#xff0c;他其實說的是無數成功人士的心聲 —— “我配得上&#xff01;” 美劇《絕命毒師》有個導演叫文斯吉里根&#xff08;Vince Gilliga…