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[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)

猜你喜欢

转载自blog.csdn.net/pjsfirstlaw/article/details/84729749