你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例 1:
輸入: [1,2,3,1]
輸出: 4
解釋: 偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。
偷竊到的最高金額 = 1 + 3 = 4 。
示例 2:
輸入: [2,7,9,3,1]
輸出: 12
解釋: 偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接著偷竊 5 號房屋 (金額 = 1)。
偷竊到的最高金額 = 2 + 9 + 1 = 12 。
這是乙個典型的揹包問題,有遞迴,記憶化搜尋,和動態規劃三種方法,遞迴會超時
動態規劃版本來了:
當有1個元素時,rob1 = nums[0];
當有2個元素時,rob2 = max(nums[0], nums[1])
當有3個元素時,如果不要第3個元素,則rob3 = rob2, 如果要第3個元素,則rob2 = rob1 + nums[2]
當有4個元素時,如果不要第4個元素,則rob4 = rob3, 如果要第4個元素,則rob4 = rob2 + nums[3]
所以,robi=max(robi-1, robi-2+nums[i])
哎呀,我真厲害,動態規劃也會了
記憶化搜尋:把遞迴結果儲存在乙個資料結構裡,通常是陣列,可以用index訪問的這種,遞迴的時候先去結果集裡查詢,如果有直接返回結果,如果沒有再遞迴
我真是個天才呀!!!
// *****************我自己寫的遞迴版本,沒有參考別人哦,我真厲害*********************
class
solution
public
introb
(int
nums,
int start)
}// *****************我參考網上揹包問題之後的遞迴版本*********************
class
solution
public
introb
(int
nums,
int index)
private
intmax
(int num1,
int num2)
}// *****************自己寫的動態規劃,哈哈我真厲害************************
class
solution
return rob2;
}private
intmax
(int num1,
int num2)
}
20190907 (leetcode習題)打家劫舍
遞迴思路 從第乙個開始偷,第n個房子處偷得的最大的總錢數要麼是第n 1個房子處偷得的總錢數,要麼是第n 2個房子處偷的總錢數 當前房子存放的錢數。class solution if result index 0 第index個房子處偷得的最大的總錢數要麼是上乙個房子處取得的最大的總錢數,要麼是上上乙...
LeetCode 198 打家劫舍
題目 你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。思路 本題的大致意思就是求取乙個...
LeetCode198 打家劫舍
你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。簡單的動態規劃問題,題目意思是計算陣列...