House Robber

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

Example 1:

Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
Total amount you can rob = 1 + 3 = 4.
Example 2:

Input: [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).
Total amount you can rob = 2 + 9 + 1 = 12.

劫匪抢银行,不能抢相邻的银行,问抢的的最大收益

自上而下思路:递归
对第k个银行,劫匪有两种选择:抢或者不抢。如果抢,最大总收益为前k-2个银行与当前银行总收益之和;如果不强,那么最大总收益为抢前k-1个银行的收益。

class Solution {
public:
    int rob(vector<int>& nums) {
        vector<int> money(nums.size(),-1);
        return rob(nums,0,money);
    }
    
    int rob(vector<int>& nums,int begin,vector<int>& money)
    {
        if (begin>=nums.size()) return 0;
        if (money[begin]!=-1) return money[begin];
        int res=max(nums[begin]+rob(nums,begin+2,money),rob(nums,begin+1,money));
        money[begin]=res;
        return res;
    }
};

递归解法有个很大的局限性,那就在于重复计算。为了降低计算复杂度,可以用一个数组存解的状态,若要解的子问题已经被求解过了,直接拿出答案即可。空间换时间,DP类似思路,只不过DP是自下而上解。

自下而上迭代求解,DP思想。状态转移方程就是上面递归地思想,只不过DP需要起始状态。我们用money数组存放抢得的最大收益,money[k]代表抢了前k家最大收益。

class Solution {
public:
    int rob(vector<int>& nums) {
        if (nums.empty()) return 0;
        
        vector<int> money(nums.size()+1,-1);
        money[0]=0; 
        money[1]=nums[0]; // 抢一家时的最大收益
        for(int i=1;i<nums.size();i++)
        {
            money[i+1]=max(money[i],money[i-1]+nums[i]);
        }
        return money[nums.size()];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值