• leetcode 337. House Robber III


    题意

    题目链接: https://leetcode.com/problems/house-robber-iii/
    就是一颗树,然后头结点选了的话,只能选孙子结点
    然后求这个树的可以选的最大的和

    解法一

    暴力+记忆化, 就是dfs(root, can)表示 当前root结点 可不可以被选
    显然当前节点 可以选的话 结果就是 max(root->val + dfs(root->l, notcan) + dfs(root->r, notcan), dfs(root->l, can) + dfs(root->r, can))
    如果不可以选的话 结果就是 dfs(root->l, can) + dfs(root->r, can)

    typedef pair<TreeNode*, bool> ptb;
    class Solution {
    public:
        map<ptb, int> mp;
        
        int dfs(TreeNode *root, bool can) {
            if(root==NULL) return 0;
            if(mp.count({root, can}))
                return mp[{root, can}];
            if(can) {
                mp[{root,can}] =  max(root->val + dfs(root->left, !can) + dfs(root->right, !can),
                           dfs(root->left, true)+dfs(root->right, true));
                return mp[{root, can}];
            } else {
                mp[{root,can}] = dfs(root->left, true) + dfs(root->right, true);
                return mp[{root, can}];
                // return dfs(root->left, true) + dfs(root->right, true);
            }
        }
        
        int rob(TreeNode* root) {
            if(root == NULL) return 0;
            return dfs(root, true);
        }
    };
    

    解法二

    我们使用vector来存 两个值
    v[0] 代表当前节点可以选 v[1] 代表节点不可以选的最大值

    那么很显然同上面,直接v[root][0] = max(root->val+v[root->l][1]+v[root->r][1], v[root->l][0]+v[root->r][0]);
    v[root][1] = v[root->l][0]+v[root->r][0]
    递归求解即可

    class Solution {
    public:
        
        // v[0] means rob the root, v[1] means not rob the root
        vector<int> dfs(TreeNode *root) {
            if(root == NULL)
                return {0, 0};
            vector<int> v1 = dfs(root->left);
            vector<int> v2 = dfs(root->right);
            int res1 = max(root->val + v1[1] + v2[1], v1[0]+v2[0]);
            int res2 = v1[0]+v2[0];
            return {res1, res2};
        }
        
        int rob(TreeNode* root) {
            vector<int> s = dfs(root);
            return max(s[0], s[1]);
        }
    };
    
  • 相关阅读:
    Java hibernate 遇到的问题:could not read a hi value
    Java 小知识
    Java 在使用@Select遇到的问题:拼接字符串将数组拼为了字符串
    飞逝的光阴
    终于回来了
    再说创客
    离开一段时间
    抛弃QP
    关于创客
    对DTU系统结构的重新思考
  • 原文地址:https://www.cnblogs.com/Draymonder/p/11297866.html
Copyright © 2020-2023  润新知