动态规划-53.最大子数组和-力扣(LeetCode)

一、题目解析

在给定顺序的数组中找出一段具有最大和的连续子数组,且大小最小为1.

二、算法原理

1.状态表示

我们可以意一一枚举出所有的子数组,但我们想要的是最大子数组,所以fi表示:以i位置为结尾,所有子数组的最大和

2.状态转移方程

fi当长度为1时,此时的子数组和为numsi,当长度大于1时,此时的子数组和为0,i-1的子数组最大值加上numsi,我们需要取二者中的最大值。

所以fi=max(numsi,fi-1+numsi);

3.初始化

在计算fi中我们用到了fi-1当i处于0位置时,越界访问,所以我们可以直接初始化f0,或者加一个虚拟格子用于初始化。

4.填表顺序

从左到右填表,保证所需值已计算

5.返回值

由于fi中存储的是到达i位置的最大子数组和,我们需要知道从0,n-1 区间内的最大值,所以返回值为fi中的最大值

思考与实践同等重要,在思考后可以去实现一下,链接:53. 最大子数组和 - 力扣(LeetCode)

三、代码示例

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n+1);
        for(int i = 1;i<=n;i++)
        {
            dp[i] = max(nums[i-1],dp[i-1]+nums[i-1]);
        }
        int MAX = INT_MIN;//数组中存在负数,所以在比大小时用int的最小值比较,也可以赋值f[1]从2到n开始比较
        for(int i = 1;i<=n;i++)
        {
            if(dp[i]>MAX) MAX = dp[i];
        }

        return MAX;
    }
};

看到最后,如果对您有所帮助请点赞、收藏和关注, 点点关注不迷路,我们下期再见!

相关推荐
YH55269845 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
吃着火锅x唱着歌6 小时前
Effective C++ 学习笔记 条款43 学习处理模板化基类内的名称
c++·笔记·学习
felixking7 小时前
C++20 协程
开发语言·c++·协程
遥感知识服务7 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶7 小时前
1-13-TimSort
算法
ZJU_统一阿萨姆7 小时前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构
小小龙学IT9 小时前
FlatBuffers 深度解析:Google 开源零拷贝序列化库完全指南
c++·开源
叩码以求索9 小时前
浅谈:前序遍历反转法求解N叉树的后序遍历
算法
wuminyu10 小时前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
SWAGGY..10 小时前
【C++进阶】:(1)继承机制详解
java·jvm·c++