最大子数组和,及子数组序列
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n;
cin >> n; %数组长度n
vector<int> vec(n);
for (int i = 0;i < n;i++) {
cin >> vec[i];
}
vector<int> newfirst; %存放开始重新计算sum的位置
int sum = 0;
int *dp=new int[n];
for (int i = 0;i < n;++i) {
if (sum < 0) { %<0 则重新计算sum
sum = vec[i];
dp[i] = vec[i];
newfirst.push_back(i); %将重新计算sum的位置存放在容器中
}
else {
sum += vec[i];
dp[i] = sum;
}
}
int fir_point=0,last_point,maxsum=0; %fir_piint、last_point分别存放子数组的起止位置
for (int i = 0;i < n;++i) {
if (dp[i] > maxsum)
{
maxsum = dp[i]; %最大子数组和
last_point = i; %最大子数组终止位置
}
}
for (int i = newfirst.size() - 1;i >= 0;--i) {
if (newfirst[i] <= last_point)
{
fir_point = newfirst[i]; %最大子数组起始位置
break;
}
}
cout << "maxsum="<<maxsum << endl;
for (int i = fir_point;i <= last_point;i++) {
cout << vec[i] << " " ;
}
return 0;
}
算例输出:
5
4 7 -8 5 9
maxsum=17
4 7 -8 5 9
6
0 1 4 -2 -4 8
maxsum=8
8