題目鏈接: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];
}
};