题目描述:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
意思就是非相邻的数字累加的最大值,比如输入是[1,2,3,4],那么最大金额就是2+4=6,[1,2,2,4,1,1,5],最大金额就是1+4+5=10。
首先想到的是计算所有可能的结果然后取最大值,但是要考虑的情况太复杂,无法直接计算。另外一种思路就是动态规划。设v[i]为到第i个金额所累加的最大值,m[i]为第i个房间的金额,易得v[1]=m[1],v[2]=max(m[1],m[2])。
v[3]有三种情况:
- v[3]=m[1]+m[3]
- v[3]=m[2]
- v[3]=m[1]
所以v[3]=max(v[1]+m[3],v[2])。 v[4]有三种情况:
- v[4]=m[1]+m[3]
- v[4]=m[1]+m[4]
- v[4]=m[2]+m[4]
所以v[4]=max(v[2]+m[4],v[3]),由此可以看出公式v[i]=max(v[i-2]+m[i],v[i-1]),那么就很容易写出代码。
class Solution {
public:
int rob(vector<int>& nums) {
vector<int> v;
v.push_back(0);//v[-1]=0
v.push_back(0);//v[0]=0
for(int i =2;i<=nums.size()+1;++i)
{
v.push_back(max(v[i-2]+nums[i-2],v[i-1]));
}
return v[nums.size()+1];
}
};