题目链接:leetdcode337
思路:先序列化,再树形DP,上一个节点如果选取则下一层节点不会取,否则从下层选和不选选一个最大的传递上来。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int rob(TreeNode* root) {
if(!root) return 0;
vector<vector<int> > G; G.clear();
int n=0;
dfs1(root, n, G);
vector<vector<int> > dp(n+1, vector<int>(2, -1));
return max(dfs2(0, 0, G, dp), dfs2(0, 1, G, dp));
}
//dfn序建表
void dfs1(TreeNode* rt, int& sz, vector<vector<int> >& G) {
G.push_back({rt->val});
int cur = sz;
if(rt->left) {
G[cur].push_back(++sz);
dfs1(rt->left, sz, G);
}
if(rt->right) {
G[cur].push_back(++sz);
dfs1(rt->right, sz, G);
}
}
//树形DP rt结点选或不选
int dfs2(int rt, int chio, vector<vector<int> >& G, vector<vector<int> >& dp) {
if(dp[rt][chio] != -1) return dp[rt][chio];
//当前节点选与不选
if(chio) dp[rt][chio] = G[rt][0];
else dp[rt][chio] = 0;
for(int i=1; i<G[rt].size(); i++) {
//处理分支中选与不选的最大值
if(chio) dp[rt][chio] += dfs2(G[rt][i], 0, G, dp);
else dp[rt][chio] += max(dfs2(G[rt][i], 0, G, dp), dfs2(G[rt][i], 1, G, dp)); //当当前节点不选则可以考虑对分支选和不选中取一个最大
}
return dp[rt][chio];
}
};