LeetCode HOT100 - 打家劫舍 III
树形dp
类似的形式,只是这次放到了树上,或者说,和它相邻的前驱节点的个数增加了
我们仍然是考虑每个节点选还是不选
如果选,那么子节点一定不选
如果不选,那么子节点是可以选也可以不选
树的话就不妨显式的 dp 数组,用 dfs 回传的信息作为子节点的信息,并据此来计算当前节点的情况
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int rob(TreeNode* root) {
auto dfs = [&](auto self, TreeNode* x) -> pair<int, int> {
if (!x) {
return {0, 0};
}
auto l = self(self, x->left);
auto r = self(self, x->right);
return {max(l.first, l.second) + max(r.first, r.second), x->val + l.first + r.first};
};
auto ans = dfs(dfs, root);
return max(ans.first, ans.second);
}
};

浙公网安备 33010602011771号