动态规划,构造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]); } };
原文地址:http://blog.csdn.net/stephen_wong/article/details/46274969