leetcode 53.最大子数组和

思路:dp。

虽然说是很基础的DP题,但是作者并没有搞透彻这道题,所以温故而知新,再次刷一次leetcode上的这种类型的题。

首先我们需要看清题目,这里说的是连续子数组,而不是子序列,我们需要注意的就是这道题和子序列的题是很相似的,就比如前面说过的哪个最长递增子序列一样,我们需要借用那里的思想,对于以...为结尾进行考虑。

这里我们的状态方程设为dpi,就代表着我们以numsi为结尾的最大连续子序列和。好了,问题就是怎么进行递推操作。

当我们以某一个数为结尾的时候,我们这个时候已经把后面的的数的最大子序列和求出来了,所以我们需要考虑这样一个问题:我们当前的数加上后面已经计算出来的最大子序列和,结果是变小了还是变大了?如果我们加的是负数,那当然是变小了,但是如果说是正数,那么我们就需要在本数的基础上再加上后面的连续和。

这样判断出来就是结果了。

注意:我们需要注意到,求出来每一个数作为尾的最大连续和之后,我们需要求出来一个最大值,这个时候就必须从中选出一个最大值来,所以需要处理一下。

还有,就是在处理的时候,需要初始化dp数组,然后,变量res也需要初始化为很小数,因为可能是负数,所以需要赋值一个很小的数。

复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int dp[100010];
        memset(dp,-2e9,sizeof dp);
        dp[0]=nums[0];
        if(nums.size()==1)
        return nums[0];
        for(int i=1;i<nums.size();i++){
            if(dp[i-1]<=0)
            dp[i]=nums[i];
            else
            dp[i]=dp[i-1]+nums[i];
        }
        int res=-2e9;
        for(int i=0;i<nums.size();i++){
            res=max(res,dp[i]);
        }
        return res;
    }
};
相关推荐
一次旅行16 分钟前
RLHF全链路深度解析:Reward Model数学推导+PPO完整实战,对比GRPO轻量化方案
人工智能·算法·机器学习
Wang's Blog19 分钟前
AI Agent白手起家29: Few Shot 提示词工程实战
人工智能·算法
June`1 小时前
warp shuffle指令
c++·人工智能·算法·cuda
geovindu1 小时前
go:Bit Operation Algorithm
开发语言·后端·算法·golang·位运算法
乱七八糟的屋子1 小时前
【C++数值计算】NumCpp超详细入门教程(纯正Numpy语法、零学习成本、C++首选科学计算库、性能压测对比)
c++·数值计算·numpy·高性能计算·科学计算·ndarray
choumin1 小时前
C程序能调用extern “C“声明的带默认参数的C++函数吗?
c语言·c++·extern c·默认参数
AmyLin_20012 小时前
PDF 色彩保真工程实践【3】上手实践:工程结构、依赖集成与一键构建运行
c++·visualstudio·pdf·zlib·vcpkg·libtiff·cmyk
并不喜欢吃鱼2 小时前
从零开始 C++------ 十六.深度拆解 C++ 智能指针:unique_ptr/shared_ptr/weak_ptr 底层模拟、内存泄漏根治
开发语言·c++
Wang's Blog2 小时前
AI Agent白手起家31: 根据语义相似度动态选择 Few Shot 示例
人工智能·算法
不相心 -w-2 小时前
Cmake的基础用法
linux·开发语言·c++