动态规划-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;
    }
};

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

相关推荐
Polevne5 分钟前
C# GRPC 一元与双向流
linux·算法·c#
huang5791477 分钟前
复杂网络中的最短路径搜索算法性能分析3
算法
找方案11 分钟前
AI+气象预报:华为盘古大模型如何让天气预报精准到街区
人工智能·算法·机器学习
码匠许师傅21 分钟前
【C++三方组件】nlohmann/json:像写 STL 一样操作 JSON
c++
Yingye Zhu(HPXXZYY)27 分钟前
洛谷B4337 [中山市赛 2023] 简单数学题
c++·算法
郝学胜-神的一滴30 分钟前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
开发语言·数据结构·c++·软件工程·visual studio
pen-ai36 分钟前
【优化方法】为什么梯度是最陡峭的方向?
人工智能·算法·机器学习·最小二乘法
个 人 练 习 生39 分钟前
数据结构:排序算法详解
c语言·数据结构·经验分享·学习·算法·排序算法
m0_7345717640 分钟前
深入理解C++ 析构函数<四>虚析构函数
开发语言·c++
青山木1 小时前
枚举类DP进阶:完全平方数与零钱兑换
java·数据结构·算法·leetcode·动态规划