经典动态规划
定义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)

京公网安备 11010502036488号