Week13 House Robber

Week13

Dynamic Programming
question source: House Robber

question description

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.

解决方法

题目是说你能偷一排房子,但不能连续偷两个连续的房子,因为会报警,计算你一晚上在不报警的情况下能偷多少。首先定义子问题money[i[为前i间房子最多能偷的钱。那么问题的解就是money[size - 1]。一间房子i,你要么偷要么不偷,偷的话,你能得到的最大值为money[i - 2] + nums[i],不偷的话,你能得到的最大值为money[i - 1],取两者的最大值。
m o n e y [ i ] = m a x { m o n e y [ i − 2 ] + n u m s [ i ] , m o n e y [ i − 1 ] money[i] = max \{money[i - 2] + nums[i], money[i - 1] money[i]=max{money[i2]+nums[i],money[i1]
然后定义开始值。要多一个额外的值money[0]标记为0。money[1]为nums[0]

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

算法复杂度是 O ( n ) O(n) O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值