Problem P26. [算法课动态规划] 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
提示:
- 1 <= nums.length <= 100
- 0 <= nums[i] <= 400
输入
输入每个房屋存放金额的非负整数数组
输出
输出一夜之内能够偷窃到的最高金额
样例
标准输入复制文本 |
1 2 3 1 |
标准输出复制文本 |
4 |
标准输入复制文本 |
2 7 9 3 1 |
标准输出复制文本 |
12 |
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int rob(vector<int>& nums)
{
if (nums.size() == 0) return 0;
if (nums.size() == 1) return nums[0];
vector<int> dp(nums.size());
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for (int i = 2; i < nums.size(); i++)
{
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
}
return dp[nums.size() - 1];
}
};
int main()
{
Solution sol;
vector<int> nums;
int i;
while (cin >> i)
{
nums.push_back(i);
if (cin.get() == '\n') break;
}
cout << sol.rob(nums)<<endl;
return 0;
}