题解33 | #动态规划#连续子数组的最大和#

连续子数组的最大和

https://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484

1.动态规划——时间复杂度O(n),空间复杂度O(n)

#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param array int整型vector 
     * @return int整型
     */
    int FindGreatestSumOfSubArray(vector<int>& array) {
        // write code here
        vector<int>sum(array.size());
        int max = array[0];
        for(int i = 0; i < array.size(); i++){
            sum[i] = std::max(sum[i-1] + array[i] , array[i]);
            max = std::max(max , sum[i]);
        }
        return max;
    }
};

2.基本算法思想

设动态规划列表 dp,dp[i] 代表以元素 array[i] 为结尾的连续子数组最大和。状态转移方程: dp[i] = Math.max(dp[i-1]+array[i], array[i]);

具体思路如下:

1.遍历数组,比较 dp[i-1] + array[i] 和 array[i]的大小;

2.为了保证子数组的和最大,每次比较 sum 都取两者的最大值;

3.用max变量记录计算过程中产生的最大的连续和dp[i];

3.完整实例

#include<iostream>
using namespace std;
int a[200000],dp[200000];
int main(){
    int n,i;
    cin>>n;
    //从0开始
    for(i = 0;i < n;i++){
        cin>>a[i];
    } 
    //初始化一下
    dp[0] = a[0];
    int res = dp[0];
    //从1开始防止数组溢出
    for(i = 1;i < n; i++){
        dp[i] = std::max(dp[i-1] + a[i] , a[i]);
        res = std::max(res , dp[i]);
    }
    cout<<res;
    return 0;
}
// 64 位输出请用 printf("%lld")

示例1

输入:

8
1 -2 3 10 -4 7 2 -5

输出:

18

说明:

经分析可知,输入数组的子数组[3,10,-4,7,2]可以求得最大和为18 
2024考研数据结构 文章被收录于专栏

本人考研刷算法题,立此专栏练习强化。

全部评论
斐波那契数列、跳台阶、最小花费爬楼梯以及此次连续子数组最大和都是经典的动态规划问题
点赞 回复 分享
发布于 2023-10-04 17:32 辽宁

相关推荐

点赞 评论 收藏
分享
我即大橘:耐泡王
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务