原题链接:A1007 Maximum Subsequence Sum
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include <ctime>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
using namespace std;
typedef struct Node
{
int first;//记录此时取最大值时的下标从哪开始,无需使用last标记最后一个
int sum;//最大连续和
}Node;
const int MAX = 10010;
int K, N[MAX], largest = 0;
Node DP[MAX] = {{0}};
bool flag = false;
int main()
{
scanf("%d", &K);
for(int i=0; i<K; i++)
{
scanf("%d", &N[i]);
if(N[i] >= 0) flag = true;//标记是否为全负
if(!i) DP[i].sum = N[i];//第一个就是N【0】了
else
{
if(N[i] > DP[i-1].sum + N[i])//此时不能用>=,否则其first不是最小
{
DP[i].first = i;
DP[i].sum = N[i];
}
else
{
DP[i].first = DP[i-1].first;
DP[i].sum = DP[i-1].sum + N[i];
}
if(DP[i].sum > DP[largest].sum) largest = i;//largest标记最大值得下标
}
}
if(!flag) printf("0 %d %d", N[0], N[K-1]);//分开打印;注意是输出序列值,而不是下标,我刚开始就搞错了~~~
else printf("%d %d %d", DP[largest].sum, N[DP[largest].first], N[largest]);
return 0;
}