1、题目描述
输入一个数组表示一街坊的住户每家有多少钱,小偷不能连着偷相邻的两家,问小偷最多偷多少钱。
2、思路
动归。
dp[i] = nums[i] + max(dp[k]), k<=i-2
ans = max(dp[i]),负责度 O(n^2)
简化:用变量curr保存可以偷前i-1家得到的最大值;变量pre保存可以偷前i-2家得到的最大值
变量t表示可以偷前i家得到的最大值。
t = max(curr, pre + nums[i])
遍历数组,得到最后的t。
时间复杂度 O(n),空间constant。
3、代码
int rob(vector<int>& nums) {
int n = nums.size();
if(n==0) return 0;
int dp[n];
int ans = INT_MIN;
for(int i=0;i<n;i++){
dp[i]=nums[i];
int m = 0;
for(int j=i-2;j>=0;j--){
if(dp[j]>m)
m=dp[j];
}
dp[i]+=m;
if(dp[i]>ans)
ans=dp[i];
}
return ans;
}
int rob1(vector<int>& nums,int l,int r) {
if(l==r) return nums[l];
int pre = 0, curr=0;
for(int i=l;i<=r;i++){
int t = max(pre+nums[i],curr);
pre = curr;
curr = t;
}
return curr;
}