经典动态规划

定义dp[i]为遍历到第i位时的连续最大和

前缀和<0时,说明前面的负数太多了,使当前的总和小于0,应当抛弃掉前面的数,直接从当前遍历到的数“另起炉灶”

详细版:

for (int i = 1; i < N; i++) {

if(dp[i-1]<0){

dp[i]=nums[i];

}else{

dp[i]=dp[i-1]+nums[i];

}

}

合并起来就是:

dp[i] = max(nums[i], dp[i - 1] + nums[i]);

#include <iostream>
#include <vector>
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    while (cin >> N) {
        int num;
        vector<int> nums;
        for (int i = 0; i < N; i++) {
            cin >> num;
            nums.push_back(num);
        }
        vector<int> dp(N, 0);
        dp[0] = nums[0];
        for (int i = 1; i < N; i++) {
            dp[i] = max(nums[i], dp[i - 1] + nums[i]);
        }
        cout << *max_element(dp.begin(), dp.end()) << endl;
    }
    return 0;
}

时间复杂度:主要是遍历数组的开销,O(N)

空间复杂度:主要是dp数组的开销,O(N)