在上次打劫完一條街道之後和一圈房屋之後,竊賊又發現了乙個新的可以打劫的地方,但這次所有的房子組成的區域比較奇怪,聰明的竊賊考察地形之後,發現這次的地形是一顆二叉樹。與前兩次偷竊相似的是每個房子都存放著特定金額的錢。你面臨的唯一約束條件是:相鄰的房子裝著相互聯絡的防盜系統,且當相鄰的兩個房子同一天被打劫時,該系統會自動報警。
算一算,如果今晚去打劫,你最多可以得到多少錢,當然在不觸動報警裝置的情況下。
樣例1輸入:
輸出: 7
解釋:最多能偷 3 + 3 + 1 = 7.
3
/ \2 3
\ \
3 1
樣例2
輸入:
輸出: 9
解釋:最多能偷 4 + 5 = 9.
3
/ \4 5
/ \ \
1 3 1
這題是house robber和house robber ii的擴充套件,只不過這次地形由直線和圈變成了二叉樹。
解題思路與 [lintcode 614.] 二叉樹的最長連續子串行 ii 類似:
使用記錄每乙個結點的狀態,遞迴計算得出答案。
這裡對於每乙個結點都有兩狀態,被搶劫,或者不被搶劫。需要的狀態為當前子樹上搶劫的最大收益,對於乙個結點:
1
/ \2 3
/ \
5 4
最多能偷 5 + 4 + 3 = 12。
/**
* definition of treenode:
* class treenode
* }*/struct res ;
class solution
static res rob3(treenode* r) ;
res res1 = rob3(r->left);
res res2 = rob3(r->right);
int rob = r->val + res1.skip + res2.skip;
int skip = max(res1.rob, res1.skip) + max(res2.rob, res2.skip);
return ;
}};
LintCode 534 打劫房屋 II
在上次打劫完一條街道之後,竊賊又發現了乙個新的可以打劫的地方,但這次所有的房子圍成了乙個圈,這就意味著第一間房子和最後一間房子是挨著的。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是 相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。給定乙個非負整數列表,...
lintcode 打劫房屋
假設你是乙個專業的竊賊,準備沿著一條街打劫房屋。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是 相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。給定乙個非負整數列表,表示每個房子中存放的錢,算一算,如果今晚去打劫,你最多可以得到多少錢 在不觸動報警裝置的...
LintCode 打劫房屋
描述 假設你是乙個專業的竊賊,準備沿著一條街打劫房屋。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是 相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。給定乙個非負整數列表,表示每個房子中存放的錢,算一算,如果今晚去打劫,你最多可以得到多少錢 在不觸動報警...