class Solution {
public:
int rob(vector<int>& nums)
{
int m = nums.size();
int ans = 0;
vector<vector<int>> dp(m, vector<int>(2, 0));
dp[0][1] = nums[0];
for (int i=1; i<m;i++)
{
dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
dp[i][1] = max(dp[i-1][0], dp[i-1][0]+nums[i]);
}
return max(dp[m-1][0], dp[m-1][1]);
}
};
class Solution {
public:
int rob(vector<int>& nums)
{
if (nums.size()==1) return nums[0];
int m = nums.size();
vector<vector<int>> dp(m, vector<int>(2,0));
int ans = 0;
// dp[0][1] = nums[0];
for (int i=1; i<m-1; i++)
{
dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
dp[i][1] = dp[i-1][0] + nums[i];
}
ans = max(dp[m-2][1], dp[m-2][0]+nums[m-1]);
dp[0][1] = nums[0];
for (int i=1; i<m-1; i++)
{
dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
dp[i][1] = dp[i-1][0] + nums[i];
}
return max(dp[m-2][0], max(dp[m-2][1], ans));
}
};
这种方法很便捷,值得思考一下
class Solution {
public:
int rob(TreeNode* root) {
vector<int> result = robTree(root);
return max(result[0], result[1]);
}
// 长度为2的数组,0:不偷,1:偷
vector<int> robTree(TreeNode* cur) {
if (cur == NULL) return vector<int>{0, 0};
vector<int> left = robTree(cur->left);
vector<int> 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};
}
};