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);
    }
};

  

posted @ 2020-03-17 20:32  Somnuspoppy  阅读(129)  评论(0编辑  收藏  举报