337. 打家劫舍 III

状态表示:

\(f(u,0)\):表示以\(u\)为根的子树,不打劫\(u\)的情况下所能获取的最大价值。

\(f(u,1)\):表示以\(u\)为根的子树,打劫\(u\)的情况下所能获取的最大价值。

状态转移:

\[f(u,0)=\sum_{j\in Son(u)} \max(f(j,0),f(j,1)) \\ f(u,1)=\sum_{j\in son(u)} f(j,0)+w[u] \]

class Solution {
public:
    unordered_map<TreeNode*,int [2]> f;
    int rob(TreeNode* root) {
        dfs(root);
        return max(f[root][0],f[root][1]);
    }
    
    void dfs(TreeNode* u)
    {
        if(!u) return;
        dfs(u->left);
        dfs(u->right);
        f[u][0]=max(f[u->left][0],f[u->left][1])+max(f[u->right][0],f[u->right][1]);
        f[u][1]=f[u->left][0]+f[u->right][0]+u->val;
    }
};
posted @ 2021-04-17 11:46  Dazzling!  阅读(22)  评论(0编辑  收藏  举报