你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
解這道題的思路採用動態規劃的思想
設第i
ii個房屋的現金為a
ia_i
ai,有n
nn個房屋時能夠偷竊到的最高金額為f(n
)f(n)
f(n)
,則:如果有一戶人家,那答案就是本身,即 a
0a_0
a0如果有兩戶人家,那就是 max
(a0,
a1
)max(a_0, a_1)
max(a0
,a1
)如果有三戶人家,則為 max
(a0+
a2,a
1)
max(a_0+a_2, a_1)
max(a0
+a2
,a1
)由此可以歸納出:
f (n
)=ma
x(f(
n−2)
+an,
f(n−
1)
)f(n)=max(f(n-2)+a_n,f(n-1))
f(n)=m
ax(f
(n−2
)+an
,f(
n−1)
)從上式可以看出符合動態規劃的全域性最優解蘊含在區域性最優解的思想
實現演算法的時候可以參照斐波那契數列的遞迴實現方法,也是最簡單能想到的乙個方法
class
solution
introb
(vector<
int>
& nums,
int n)
};
簡單遞迴實現大量重複計算底層元素
演算法思路也是動態規劃:
f (n
)=ma
x(f(
n−2)
+an,
f(n−
1)
)f(n)=max(f(n-2)+a_n,f(n-1))
f(n)=m
ax(f
(n−2
)+an
,f(
n−1)
)不過實現的時候沒有使用遞迴,而是從前往後將每次的最優解都存在陣列裡
class
solution
return dp[n -1]
;}};
演算法思路也是動態規劃:
f (n
)=ma
x(f(
n−2)
+an,
f(n−
1)
)f(n)=max(f(n-2)+a_n,f(n-1))
f(n)=m
ax(f
(n−2
)+an
,f(
n−1)
)可以注意到,計算第i
ii個最優解f(i
)f(i)
f(i)
時,只需要f(i
−2
)f(i-2)
f(i−2)
和f (i
−1
)f(i-1)
f(i−1)
,故可以對上面的演算法進行改進
儲存上摒棄了新開闢線性空間的做法,而是只用了兩個變數來儲存這兩個最優解
class
solution
return cur;}}
;
LeetCode 198 打家劫舍
題目 你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。思路 本題的大致意思就是求取乙個...
LeetCode198 打家劫舍
你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。簡單的動態規劃問題,題目意思是計算陣列...
LeetCode198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...