The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place forms a binary tree". It will automatically contact the police if two directly-linked houses were broken into on the same night.
Determine the maximum amount of money the thief can rob tonight without alerting the police.
Example 1:
3 / \ 2 3 \ \ 3 1Maximum amount of money the thief can rob = 3 + 3 + 1 = 7 .
Example 2:
3 / \ 4 5 / \ \ 1 3 1
Maximum amount of money the thief can rob = 4 + 5 = 9.
class Solution {
public:
map<TreeNode*,int> positive;
map<TreeNode*,int> negative;
int rob(TreeNode* root) {
TreeNode* p=root;
if(p==NULL){
positive[p]=0;
negative[p]=0;
return 0;
}else{
negative[p]=rob(p->left)+rob(p->right);
positive[p]=negative[p->left]+negative[p->right]+p->val;
return positive[p]>negative[p]?positive[p]:negative[p];
}
}
};
思路心得:
DP题目,用两个表分别记录某屋子被抢和不被抢时,以其作为根节点时的最大受益。
所以在递推的时候
某点不被抢的最大受益则是其两个子树的最大收益之和
某点若被抢,则查表将其左右子树不被抢时的最大受益相加并加上该屋本身的受益。
然后对比被抢和不被抢的受益返回更大的一个值。
(PS:当初在计算某点不被抢的受益的时候我用了一个非常SB的方法,就是求出左右两子树被抢一边以及两边都被抢的情况,结果忘记加上左右两边都不被抢的情况了)