题意:
你是一个专业的小偷,计划偷窃沿街的房屋。
每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,
如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
数据范围:
0 <= nums.length <= 100
0 <= nums[i] <= 400
解法:
令d[i][0/1]表示 不选/选 i的最大收益
转移方程:
d[i][0]=max(d[i-1][0],d[i-1][1]).
d[i][1]=d[i-1][0]+a[i].
设下标为[0,n-1],
那么max(d[n-1][0],d[n-1][1])就是答案.
code:
class Solution {
public:
int rob(vector<int>& a) {
int n=a.size();
if(!n)return 0;
vector<vector<int> >d(n+5,vector<int>(2,0));
d[0][1]=a[0];
for(int i=1;i<n;i++){
d[i][0]=max(d[i-1][0],d[i-1][1]);
d[i][1]=d[i-1][0]+a[i];
}
return max(d[n-1][0],d[n-1][1]);
}
};