leetcode-198 House Robber

题目大意:
你是一名专业强盗,计划沿着一条街打家劫舍。每间房屋都储存有一定数量的金钱,唯一能阻止你打劫的约束条件就是:由于房屋之间有安全系统相连,如果同一个晚上有两间相邻的房屋被闯入,它们就会自动联络警察,因此不可以打劫相邻的房屋。


给定一列非负整数,代表每间房屋的金钱数,计算出在不惊动警察的前提下一晚上最多可以打劫到的金钱数。


解题思路:
动态规划(Dynamic Programming)


状态转移方程:


dp[i] = max(dp[i - 1], dp[i - 2] + num[i - 1])


其中,dp[i]表示打劫到第i间房屋时累计取得的金钱最大值

其中dp[0]即为num[0],dp[1]此时应该为max(num[0], num[1]),代码如下:

时间复杂度O(n),空间复杂度O(n)

<span style="font-family:Microsoft YaHei;font-size:14px;">class Solution {
public:
    int rob(vector<int> &num) {
        if(num.size() <=1 ) return num.size()==0 ? 0 : num[0];
        vector<int> dp = {num[0],max(num[0],num[1])};
        for(int i=2; i < num.size(); i++){
            dp.push_back(max(dp[i-2]+num[i],dp[i-1]));
        }
        return dp.back();
    }
};</span>


也可以简化,不使用vector<int>来保存结果

class Solution {
public:
    int rob(vector<int> &num) {
        int len = num.size();
        if(len == 0) return 0;
        if(len == 1) return num[0];
        
        int res = 0,prev = 0;
        for(int i = 0; i < len; i++){
            int tmp = prev;
            prev = res;
            res = max(tmp+num[i],prev);
        }
        return res;
    }
};


转自:http://bookshadow.com/weblog/2015/04/01/leetcode-house-robber/


bookshadow上有很多leetcode的解题思路,讲的很正确,可以参考

猜你喜欢

转载自blog.csdn.net/sole_cc/article/details/45009069
今日推荐