动态规划,构造dp[n][2]数组,
dp[i][0]: 在不取nums[i]的情况下,从nums[0, 1, ..., n]中能获得的最大值;
dp[i][1]: 在取nums[i]的情况下,从nums[0], 1, ..., n]中能获得的最大值。
注意到,max(dp[i][0], dp[i][1])表征了从nums[0, 1, ..., n]中获得的最大值。
初始化:
dp[0][0] = 0;
dp[0][1] = nums[1].
状态方程:
dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
dp[i][1] = dp[i-1][0] + nums[i];
代码:
class Solution
{
public:
int rob(vector<int>& nums)
{
if (nums.empty())
{
return 0;
}
vector<vector<int>> dp(nums.size(), vector<int>(2, 0));
dp[0][0] = 0;
dp[0][1] = nums[0];
for (size_t i = 1; i < nums.size(); ++ 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[nums.size()-1][0], dp[nums.size()-1][1]);
}
};