思想:树形DP,这里用两个int型变量 stole,unStole分别表示从当前TreedNode所表示房间时开始,之后选择偷或者不偷这个以及后面的房间时身上的最大金额,初始值分别为root.val和0
其状态转移方程为:
1、如果要偷root这个房间,则接下来只能对其孩子的孩子所表示的房间做新一轮选择
2、如果不偷root这个房间,则接下来应该是要对其孩子所表示的房间做新一轮选择
class Solution {
HashMap<TreeNode,Integer> memo = new HashMap<>();
public int rob(TreeNode root) {
if(root==null)return 0;
if(memo.containsKey(root)) return memo.get(root);
int stole = root.val;
//如果要偷root这个房间,则接下来只能对其孩子的孩子所表示的房间做新一轮选择
if(root.left!=null) stole+=rob(root.left.left)+rob(root.left.right);
if(root.right!=null) stole+=rob(root.right.left)+rob(root.right.right);
//如果不偷root这个房间,则接下来应该是要对其孩子所表示的房间做新一轮选择
int unStole=0;
unStole+=rob(root.left)+rob(root.right);
memo.put(root,Math.max(stole,unStole));
return Math.max(stole,unStole);
}
}