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