原题目:https://leetcode-cn.com/problems/house-robber-iii/
思路:
和买卖股票很像,用f表示选择该节点,偷的值。g表示不选择该节点偷的值,那么容易得到状态转移方程
f[root] = g[root->left] + g[root->right] + root->val;
g[root] = max(f[root->left], g[root->left]) + max(f[root->right],g[root->right])
代码:
class Solution {
unordered_map<TreeNode* ,int> f,g;
public:
void dfs(TreeNode* root){
if(root==NULL) return;
dfs(root->left);
dfs(root->right);
f[root] = root->val + g[root->left] + g[root->right];
g[root] = max(f[root->left],g[root->left]) + max(f[root->right],g[root->right]);
}
int rob(TreeNode* root) {
dfs(root);
return max(f[root],g[root]);
}
};