[Leedcode][JAVA][第198题][打家劫舍][动态规划]
【問(wèn)題描述】[簡(jiǎn)單]
你是一個(gè)專業(yè)的小偷,計(jì)劃偷竊沿街的房屋。每間房?jī)?nèi)都藏有一定的現(xiàn)金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統(tǒng),如果兩間相鄰的房屋在同一晚上被小偷闖入,系統(tǒng)會(huì)自動(dòng)報(bào)警。給定一個(gè)代表每個(gè)房屋存放金額的非負(fù)整數(shù)數(shù)組,計(jì)算你 不觸動(dòng)警報(bào)裝置的情況下 ,一夜之內(nèi)能夠偷竊到的最高金額。示例 1:輸入: [1,2,3,1] 輸出: 4 解釋: 偷竊 1 號(hào)房屋 (金額 = 1) ,然后偷竊 3 號(hào)房屋 (金額 = 3)。偷竊到的最高金額 = 1 + 3 = 4 。【解答思路】
1. 動(dòng)態(tài)規(guī)劃
第 1 步:設(shè)計(jì)狀態(tài)
int[] dp = new int[len + 1];
第 2 步:狀態(tài)轉(zhuǎn)移方程
dp[n] = MAX( dp[n-1], dp[n-2] + num )
第 3 步:考慮初始化
dp[0] = 0;
dp[1] = nums[0];
第 4 步:考慮輸出
dp[len]
第 5 步:考慮是否可以狀態(tài)壓縮
方法2
時(shí)間復(fù)雜度:O(N) 空間復(fù)雜度:O(N)
與上面方法略有不同
class Solution {public int rob(int[] nums) {int n = nums.length;// 處理邊界條件。if (n == 0) {return 0;}if (n == 1) {return nums[0];}// 定義dp數(shù)組,按照狀態(tài)轉(zhuǎn)移方程遞推。int[] dp = new int[n];dp[0] = nums[0];dp[1] = Math.max(nums[0], nums[1]);for (int i = 2; i < n; i++) {dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);}return dp[n - 1];} }2. 動(dòng)態(tài)規(guī)劃壓縮空間
參照著 dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]) 這個(gè)方程來(lái)寫,
用 a 表示 i - 2,b 表示 i - 1,
因此上面的方程變成了dp[i] = max(b, a + nums[i]),
然后下一輪循環(huán)的時(shí)候:
i - 1 就變成了i - 2,因此現(xiàn)在需要把 b 賦值給 a;
i 就變成了 i - 1,因此現(xiàn)在需要把 dp[i] 賦值給 b。
時(shí)間復(fù)雜度:O(N) 空間復(fù)雜度:O(1)
class Solution {public int rob(int[] nums) {int a = 0, b = 0;for (int i = 0; i < nums.length; i++) {int c = Math.max(b, a + nums[i]);a = b;b = c;}return b;} }【總結(jié)】
1.dp數(shù)組設(shè)置多一個(gè) 在前面添加后者后面添加
int[] dp = new int[len + 1];
2.動(dòng)態(tài)規(guī)劃流程
第 1 步:設(shè)計(jì)狀態(tài)
第 2 步:狀態(tài)轉(zhuǎn)移方程
第 3 步:考慮初始化
第 4 步:考慮輸出
第 5 步:考慮是否可以狀態(tài)壓縮
3.動(dòng)態(tài)規(guī)劃做多了 第一次自己寫了出來(lái),可惜初始化沒(méi)有想全面
轉(zhuǎn)載鏈接:https://leetcode-cn.com/problems/house-robber/solution/liang-ge-yue-0ji-chu-cong-an-mo-shi-zhuan-xing-zi-/
總結(jié)
以上是生活随笔為你收集整理的[Leedcode][JAVA][第198题][打家劫舍][动态规划]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 万能地图下载器标绘线的参数说明
- 下一篇: 《交互式程序设计 第2版》一3.6 关系