leetcode 每日一题 2021.5.5 740. 删除并获得点数

前置题目 

198. 打家劫舍

方法

如果房屋数量大于两间,应该如何计算能够偷窃到的最高总金额呢?对于第 k (k>2) 间房屋,有两个选项:

  1. 偷窃第 k 间房屋,那么就不能偷窃第 k-1 间房屋,偷窃总金额为前 k−2 间房屋的最高总金额与第 k 间房屋的金额之和。
  2. 不偷窃第 k 间房屋,偷窃总金额为前 k-1 间房屋的最高总金额。

因此推出状态转移方程:

Code

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.empty()){
            return 0;
        }

        int size = nums.size();
        if(size==1){
            return nums[0];
        }

        //前i间房屋能偷窃到的最高总金额
        vector<int> dp = vector<int>(size,0);

        dp[0] = nums[0]; //边界条件
        dp[1] = max(nums[0],nums[1]); 

        for(int i = 2;i<size;++i){
            dp[i] = max(dp[i-2] + nums[i],dp[i-1]);
        }

        return dp[size-1];
    }
};
//https://leetcode-cn.com/problems/house-robber/solution/da-jia-jie-she-by-leetcode-solution/

740. 删除并获得点数

参考题解

class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        int maxVal = 0;

        for(int num:nums){
            maxVal = max(maxVal,num);
        }

        int sums[maxVal+1];

        //初始化为0
        memset(sums,0,sizeof(int)*(maxVal+1));

        for(int num:nums){
            sums[num] += num;
        }

        //简化空间复杂度
        int d2 = sums[0];
        int d1 = sums[1];

        for(int i = 2;i<=maxVal;++i){
            //临时拷贝后续赋值给d2
            int temp = d1;

            //计算新的d1
            d1 = max(d2+sums[i],d1);

            //d[i-1]->d[i-2]
            d2 = temp;
        }

        return d1;
    }
};

//https://leetcode-cn.com/problems/delete-and-earn/solution/740-cji-hu-shuang-bai-de-dong-tai-gui-hu-blc8/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值