打家劫舍首先dp三部曲是,1.找出重複子問題 2.狀態定義 3.定義dp方程難度簡單786
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例 1:
輸入: [1,2,3,1]
輸出: 4
解釋: 偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。
偷竊到的最高金額 = 1 + 3 = 4 。
1.求解的問題是偷取最大金額,而子問題劃分後 就是偷取當前房子是最大值
2.狀態的定義 因為要記錄當前是投還是沒投 所以採用二維dp
一維記錄當前在哪個房子,二維記錄當前是否偷沒。 0>沒偷 1>偷
3.dp方程
a[i][0] = math.max(a[i-1][0],a[i-1][1]);//如果當前不偷,前乙個可偷 也可不偷
a[i][1] = a[i-1][0]+nums[i];//當前偷 前乙個不偷 加上當前的錢數
//time o(n) space o(n*2)
public
introb
(int
nums)
return math.
max(a[n-1]
[1],a[n-1]
[0])
;}
上述是通過二維陣列來記錄當前的最大值 而如果我們將問題簡單化,也就是每次都拿的是最大值,那麼只需要乙個一維陣列就可以解決了。
//1.子問題劃分 每次都拿到最大值
記錄當前能拿到的最大值
= math.max(dp[i-1],dp[i-2]+nums[i]);
// time : o(n) space : o(n)
public
introb
(int
nums)
return res;
}
// time :o(n) space :o(1)
public
introb
(int
nums)
return curmax;
}
打家劫舍 LeetCode 198
這是一道線性動態規劃,當前的狀態只與特定數量的前邊狀態相關。狀態的定義 dp i 小偷偷到第i間房時,偷到的最大金額為dp i 狀態轉移方程 dp i max dp i 1 dp i 2 nums i 初始狀態 dp 0 0 dp 1 nums 0 直接使用dp陣列的,沒有進行空間優化 class ...
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
動態規劃 leetcode198
coding utf 8 遞迴class solution1 object def rob self,nums typenums list int rtype int return self.tryrob nums,0 考慮搶劫nums index,len nums 1 這個範圍的所有房子 不一定非...