LeetCode 337. House Robber III(dp)
题意:每个节点都有一个值,不同时遍历父子节点的情况下,求整棵树遍历后的和的最大值。
分析:每个节点都是选或不选,取最优
(1)选:左右子节点不能选,孙子节点可以选也可以不选
(2)不选:左右子节点可以选也可以不选
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
map<TreeNode*, int> mp;
int rob(TreeNode* root) {
if(mp[root]) return mp[root];
if(root == NULL) return 0;
int not_choose_root = rob(root -> left) + rob(root -> right);
int choose_root = root -> val;
if(root -> left != NULL){
choose_root += rob(root -> left -> left) + rob(root -> left -> right);
}
if(root -> right != NULL){
choose_root += rob(root -> right -> left) + rob(root -> right -> right);
}
return mp[root] = max(not_choose_root, choose_root);
}
};

浙公网安备 33010602011771号