198.打家劫舍
这里只需要注意递推公式就可以了:
dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
213.打家劫舍II
这里就是首尾不能同时打劫,所以需要分两种情况讨论
1.不考虑第一间房屋,后面的房子按上题方法进行考虑
2.不考虑最后一间房子,前面的房子按上题方法进行考虑
选择两种情况下的最大值
337.打家劫舍 III
一定是后序遍历(根据子节点的dp大小选择是否将父节点加入)
这里的dp数组大小为2,dp[0]表示不用当前节点,dp[1]表示使用当前节点
vectorrobTree(TreeNode* cur) { if (cur == NULL) return vector {0, 0}; vector left = robTree(cur->left); vector right = robTree(cur->right); // 偷cur,那么就不能偷左右节点。 int val1 = cur->val + left[0] + right[0]; // 不偷cur,那么可以偷也可以不偷左右节点,则取较大的情况 int val2 = max(left[0], left[1]) + max(right[0], right[1]); return {val2, val1};
遍历的返回值均为数组,因为后序遍历二叉树可以将子节点的情况继承给父节点
(cur->left得到的{val2, val1}在返回上一级后,会被cur->left所继承,参与到cur这层的选择中)
1.取当前节点,则值为:当前节点的值+不取左节点的值+不取右节点的值
2.不取当前节点,则值为:左节点(取或不取的最大值)+右节点(取或不取的最大值)
还没有评论,来说两句吧...