设为首页 加入收藏

TOP

LeetCode―House Robber 寻找数组不相邻组合最大值DP
2015-11-21 01:05:10 来源: 作者: 【 】 浏览:3
Tags:LeetCode House Robber 寻找 相邻 组合 最大值

?

题目设计了一个抢劫犯的情景,其实就是求数组中不相邻数据进行组合得到的最大值

举一个例子

假设数据: 8 3 6 15 4 9 7 10

那么首先可能选取 8 , 3

每一个数字的选取都是根据他的前两个数字,前三个数字得到的最大值进行选择,等到6的时候考虑前面只能和8组合 8,3,14

到数字15,那么就可以考虑在8,3中进行组合 8,3,14,23,4,9,7,10

接下来的步骤:

8,3,14,23,18,9,7,10

8,3,14,23,18,32,7,10

8,3,14,23,18,32,30,10

8,3,14,23,18,32,30,42 最后是42

?

class Solution {
public:
    int rob(vector
  
    &num) {
        if(num.empty())
        {
            return 0;
        }
        int res = 0;
        int length = num.size();
        if(1 == length)
        {
            return num[0];
        }
        if(length >= 3)
        {
            num[2] = num[0]+num[2];
        }
        for(int i = 3; i < length; i++)
        {
            if(num[i-2]>num[i-3])
            {
                num[i] += num[i-2];
            }
            else
            {
                num[i] += num[i-3];
            }
            
        }
        return (num[length-2]>num[length-1])? num[length-2]:num[length-1];
        
    }
};
  

?

?

其实这是一个DP的问题:

A[i][0]表示第i次没有抢劫,A[i][1]表示第i次进行了抢劫

即A[i+1][0] = max(A[i][0], A[i][1]).. 那么rob当前的house,只能等于上次没有rob的+money[i+1], 则A[i+1][1] = A[i][0]+money[i+1].

实际上只需要两个变量保存结果就可以了,不需要用二维数组

?

[cpp]?
  1. class Solution {
  2. public:
  3. int rob(vector &num) {
  4. int best0 = 0; // 表示没有选择当前houses
  5. int best1 = 0; // 表示选择了当前houses
  6. for(int i = 0; i < num.size(); i++){
  7. int temp = best0;
  8. best0 = max(best0, best1); // 没有选择当前houses,那么它等于上次选择了或没选择的最大值
  9. best1 = temp + num[i]; // 选择了当前houses,值只能等于上次没选择的+当前houses的money
  10. }
  11. return max(best0, best1);
  12. }
  13. };
    ?
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇YTUOJ-Pseudoprime numbers 下一篇[LeetCode] Majority Element

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: