1.打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例 1:
輸入: [1,2,3,1]示例 2:輸出: 4
解釋: 偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。偷竊到的最高金額 = 1 + 3 = 4 。
輸入: [2,7,9,3,1]演算法:輸出: 12
解釋: 偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接著偷竊 5號房屋 (金額 = 1)。偷竊到的最高金額 = 2 + 9 + 1 = 12 。
1.重複子問題
偷、不偷
2.狀態定義
a[0] :表示i不打劫
a[i][0] = max(a[i-1][0],a[i-1][1])
a[1] :表示要打劫i
a[i][1] = max(a[i-1][0],0)+a[i][1];
3.dp方程
1.a[i] 0....i
a[0] :表示i不打劫
a[i][0] = max(a[i-1][0],a[i-1][1])
a[1] :表示要打劫i
a[i][1] = max(a[i-1][0],0)+a[i][1];
return max(a[i][0],a[i][1]) //返回最大值
int rob(vector& nums)
int max1 =
max(dp[length-2]
[0],dp[length-2]
[1])
;//之前為不考慮最後一家
vector
int>>
dp1(length,temp)
; dp1[1]
[0]=
0;dp1[1]
[1]= nums[1]
;for
(int i=
2;i)int max2 =
max(dp1[length-1]
[0],dp1[length-1]
[1])
;//不考慮第一家
return
max(max1,max2)
;}
int
rob(vector<
int>
& nums)
introbhome
(vector<
int>
& nums,
int start,
int end)
return
max(dp[end-1]
[0],dp[end-1]
[1])
;}
3。
在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為「根」。 除了「根」之外,每棟房子有且只有乙個「父「房子與之相連。一番偵察之後,聰明的小偷意識到「這個地方的所有房屋的排列類似於一棵二叉樹」。 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。
計算在不觸動警報的情況下,小偷一晚能夠盜取的最高金額。
示例 1:
1.當前節點擊擇不偷:當前節點能偷到的最大錢數 = 左孩子能偷到的錢 + 右孩子能偷到的錢
2.當前節點擊擇偷:當前節點能偷到的最大錢數 = 左孩子選擇自己不偷時能得到的錢 + 右孩子選擇不偷時能得到的錢 + 當前節點的錢數
int
rob(treenode *root)
vector<
int>
robinternal
(treenode* root)
; vector<
int>
result(2
,0);
vector<
int> left =
robinternal
(root-
>left)
; vector<
int> right =
robinternal
(root-
>right)
; result[0]
=max
(left[0]
, left[1]
)+max(right[0]
, right[1]
);result[1]
= left[0]
+ right[0]
+ root-
>val;
return result;
}
Leetcode 打家劫舍 III
第一道樹狀dp。第一種方法,也是最容易想到的基本的dp。乙個節點的最大錢數,就是opt left opt right 和val ll lr rl rr的最大值。這樣做的話,會增加很多搜尋的時間,時間1000ms左右 definition for a binary tree node.struct t...
LeetCode 第337題打家劫舍 III
題目描述 在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為 根 除了 根 之外,每棟房子有且只有乙個 父 房子與之相連。一番偵察之後,聰明的小偷意識到 這個地方的所有房屋的排列類似於一棵二叉樹 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自...
LeetCode337 樹 打家劫舍 III
遞迴求解 本質上就是間隔遍歷 把問題直接簡化成兩個部分 偷父節點。那就是隔行遍歷左右節點,因為不能偷連續的節點。但是注意,隔行遍歷一定要判斷有無空指標!不偷父節點。可以畫幾個示意圖看看,不偷父節點的話就是父節點的左子樹 右子樹的值,依次加下去 最後返回乙個最大的金額 class solution i...