你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
/----------分割----------/
这应该是一道比较简单且典型的动态规划问题。
首先要提取出关键信息:如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。即是说,取(tou)1就要舍弃2,欲取2,就得舍弃1。
方法就是使用已有的结果进行后续的计算。
用数组money表示这条街每户家庭的钱,用n表示某家庭在这条街中的位置,用rob数组存储到n为止,能够偷到的钱有多少。在偷第n家时(n>=3),有两种选择:
①偷;
②不偷。
对应的偷盗收益是:
①偷第n家,则第n-1家不能偷,只能从前n-2家中偷取,所以总共偷了money[n]+rob[n-2];
②不偷第n家,则偷盗收益与偷前n-1家时一致,即rob[n-1]
比较这俩值,取较大的即可。
这个方法没法计算出n=2、n=1、n=0。不过显然n=2时为前两家中的较大值,n=1时为第一家的钱,n=0则偷不到钱。
贴上代码:
class Solution {
public:
int maxNum(int a, int b)
{
if (a > b)
return a;
return b;
}
int rob(vector<int>& nums) {
if (nums.size() == 0)
{
return 0;
}
if (nums.size() == 1)
{
return nums[0];
}
vector<int> rob;
rob.push_back(nums[0]);
rob.push_back(maxNum(nums[0], nums[1]));
for (int i = 2; i < nums.size(); i++)
{
rob.push_back(maxNum(rob[i - 2] + nums[i], rob[i - 1]));
}
return rob[nums.size()-1];
}
};