首页 > 其他分享 >leetcode 198. 打家劫舍

leetcode 198. 打家劫舍

时间:2023-02-21 19:04:50浏览次数:39  
标签:198 qian int nums ret 打家劫舍 leetcode dp size

dp
考虑了前一个房子进不进,发现想复杂了

class Solution {
public:
    int rob(vector<int>& nums) {
        vector<int> dp( nums.size(),0);
        int ret = 0;
        bool qian = 0;
        if( nums.size() >= 1 ){
            dp[0] = nums[0];
            qian = 1;
            ret = max(dp[0],ret);
        }

        if( nums.size()>=2){
            if( nums[1] > nums[0]){
                dp[1] = nums[1];
                qian = 1;
            }else{
                dp[1] = nums[0];
                qian = 0;
            }
            ret = max(dp[1],ret);
        }
        
        for(int i=2;i < dp.size();i++){

            if( qian == 0 ){
                if( dp[i-1] > dp[i-2]){
                    dp[i] = dp[i-1] + nums[i];
                }else{
                    dp[i] = dp[i-2] + nums[i];
                }
                qian = 1;
            }else{
                if( dp[i-2] + nums[i] < dp[i-1]){
                    dp[i] = dp[i-1];
                    qian = 0;
                }else if(dp[i-2] + nums[i] >= dp[i-1]){
                    dp[i] = dp[i-2] + nums[i] ;
                    qian = 1;
                }
            }
            //debug( dp[i] )
            ret = max(ret,dp[i]);
        }
        return ret;
    }
};

leetcode 198. 打家劫舍_不相邻


dp[i] 表示前i个房子情况下,最大的值
状态转移方程:
dp[i] = max( dp[i-2] + nums[i-1],dp[i-1] );

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

leetcode 198. 打家劫舍_最大和_02

标签:198,qian,int,nums,ret,打家劫舍,leetcode,dp,size
From: https://blog.51cto.com/liyunhao/6077021

相关文章

  • leetcode 437. 路径总和 III
    思路:从该结点开始计算sum从该节点开始继承之前的sum重复很多枝,会从一个结点重复开始很多次,需要剪枝classSolution{public:intcnt=0;intsum1=0;......
  • leetcode 405. 数字转换为十六进制数
    除以16取余继续这个过程直到为0对于负数,直接将int转成unsignedint运算即可法二:利用位运算取出每四位,然后对应一个字母classSolution{public:stringtoHe......
  • leetcode 99. 恢复二叉搜索树
    中序遍历,弄在数组里面,再弄个数组复制一份排好序比较哪里错了,换回来中序遍历的时候用map存一下数字的地址(默认没有重复元素)classSolution{public:vector<int>zh......
  • leetcode 40. 组合总和 II
    利用set去重,一维vector判断相等需要都按照一种顺序排好超时classSolution{public:vector<vector<int>>ret;vector<int>can;set<vector<int>>ans;......
  • leetcode 56. 合并区间
    区间左端点进行排序如果intervals小于等于一个元素直接返回如果大于1个按照左边点进行排序从左至右依次合并classSolution{public:staticboolcmp(vector<int>&a,vec......
  • leetcode 589. N叉树的前序遍历
    递归classSolution{public:vector<int>ret;vector<int>preorder(Node*root){findw(root);returnret;}voidfindw(Node*root){......
  • leetcode 307. 区域和检索 - 数组可修改 前缀和 | 线段树
    前缀和查询是O(1)更新是O(n)classNumArray{public:vector<int>sum;vector<int>nums;NumArray(vector<int>&nums){this->nums=nums;sum......
  • leetcode 382. 链表随机节点
    从头开始计数第i个点选择的概率是只需要区[0,i-1]的随机数,如果,取到了0,就更新返回值,否则不更新classSolution{public:/**@paramheadThelinkedlist'shead.......
  • leetcode 303. 区域和检索 - 数组不可变
    前缀和classNumArray{public:vector<int>sum;NumArray(vector<int>&nums){if(nums.size()>0){sum.push_back(nums[0]);}......
  • leetcode 105. 从前序与中序遍历序列构造二叉树
    递归,在中序中找前序的第一个元素,之后切割成两个相同子问题classSolution{public:TreeNode*buildTree(vector<int>&preorder,vector<int>&inorder){if(......