[LeetCode]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.

思路:解动态规划的题,本质上推出递推公式可以解决。

如果求n个房子的抢劫f(n)最后的解分两种情况:

1)抢劫第n个房子,然后加上抢劫n-2个房子的最大值f(n-2);

2)抢劫第n-1个房子,然后抢劫前n-3个房子的最大值f(n-3);

f(n)取其中的大值。

所以f(n)=max{A[n-1]+f(n-2),A[n-2]+f(n-3)};

特别注意这种递推关系不适合用递归求,因为会导致重复递归,最后复杂度接近指数级别。直接采用动态规划求解。

class Solution {
public:
    int rob(vector<int> &num) {
        if(num.size()==0)
            return 0;
        int step1=0;
        int step2=0;
        int step3=num[0];
        int step4=0;
        for(int i=1;i<num.size();++i){
            step4=max(num[i]+step2,num[i-1]+step1);
            step1=step2;
            step2=step3;
            step3=step4;
        }
        return step3;
    }
};


 
 


你可能感兴趣的:([LeetCode]House Robber)