leetcode刷题(2022.05.11)

本文介绍了如何使用动态规划解决LeetCode题目198 House Robber,通过状态转移方程和代码实现,探讨了如何在数组中选取最大值但避免连续取值的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

leetcode刷题(2022.05.11)

昨天没更了,忙别的事儿。估计过两天还得停。md一学期一下就过去了要,各种大作业开始堆起来了。今天写动态规划专题,从线性DP开始。

DP解题步骤
  1. 设计状态(预估时间空间复杂度)
  2. 推导状态转移方程
  3. 设定初始状态
  4. 处理非法状态
  5. 执行状态转移
  6. 后处理
  7. 返回解
    大致的流程,详细的可以去看动态规划我也是照这个刷。。
198.House Robber

难度:中等
在这里插入图片描述

题目大意

从数组中取值,不能取两个连续位置的值,最后返回能取到的最大值。

解题思路

1.数据范围:数组长度[1,100],数值满足[0,400].
2.推导状态转移方程:
定义一个状态数组ans用于存当前位置的能取的最大值。
题中说明,数组非负且不能取连续位置的值。所以每个位置上的值ans[i]=max(ans[i-2],ans[i-3])+nums[i]取得。因为只要前面能取值,都是可以增大的,又因为跨步更大的话,可以通过另一种方式取得,还可以多取一个数值。定义状态方程之后,遍历数组,更新状态方程,最后因为不能连续取值,所以输出状态数组最后两个状态中的最大值即可。

代码
class Solution {
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
        if(n<4)
        {
            if(n==3)return nums[0]+nums[2]>nums[1]?nums[0]+nums[2]:nums[1];
            else if(n==2)return max(nums[0],nums[1]);
            else return nums[0];
        }
        vector<int>ans(n);
        ans[0]=nums[0];ans[1]=nums[1];ans[2]=ans[0]+nums[2];
        int temp=max(ans[2],ans[1]);
        for(int i=3;i<n;i++)
        {
            ans[i]=max(ans[i-2],ans[i-3])+nums[i];
        }
        return max(ans[n-1],ans[n-2]);
    }
};
过题情况

在这里插入图片描述

改进

dp的题没啥改进的,时间复杂度已经为O(n)了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值