打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定乙個代表每個房屋存放金額的非負整數陣列,計算你 不觸動警報裝置的情況下 ,一夜之內能夠偷竊到的最高金額。
輸入:[1,2,3,1]
輸出:4
解釋:偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。
偷竊到的最高金額 = 1 + 3 = 4 。
力扣上的題目,動態規劃問題,簡單記錄一下我自己的做題過程(抄題的過程)
動態規劃問題最關鍵的地方就是找到特殊值和狀態轉移方程。
首先給定乙個陣列,也就是房屋,如果只有乙個房間,顯然就直接返回就好了,如果有兩個房間,那麼就返回其中的最大值。**如下:
if(len == 1)
return nums[0];
if(len == 2)
return max(nums[0],nums[1]);
狀態轉移方程
這裡的狀態轉移方程需要好好理解,剛開始做動態規劃的題目確實不是很會推的,簡單描述下。
當進第一間房間的時候,只能取這乙個 所以s0=
h0=1
s_0 = h_0 = 1
s0=h0
=1當有兩間房提供選擇時,則是取兩者最大值:s1=
max(
s0,h
1)=2
s_1 = max(s_0,h_1) = 2
s1=ma
x(s0
,h1
)=2
當有三間房屋供選擇時,由題意,如果選擇不偷那麼最大值還是s
1s_1
s1,如果偷了,則為之前的最大值+第三間屋子的值,即:s2=
max(
s2,s
0+h2
)=
4s_2 = max(s_2,s_0+h_2) = 4
s2=ma
x(s2
,s0
+h2
)=4
當有四間屋子可以選擇時,由題意,如果選擇不透,那麼最大值就是s
2s_2
s2,如果偷了就是之前的最大值+第四間房子的值,即:s3=
max(
s2,s
1+h3
)=
4s_3 = max(s_2,s_1+h_3) = 4
s3=ma
x(s2
,s1
+h3
)=4
到這裡遞推公式就可以看出來了
s n=
max(
sn−1
,sn−
2+hn
)s_n = max(s_,s_+h_n)
sn=ma
x(sn
−1,
sn−2
+hn
)到這裡後就可以寫**了:
int rob(vector& nums)
}
動態規劃 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
打家劫舍 動態規劃
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
打家劫舍(動態規劃)
打家劫舍 你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。考慮所有...