题目
题解
个人见解
#include <bits/stdc++.h>
using namespace ::std;
const int maxn = 10005;
int dp[maxn], a[maxn];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; ++i) //读入
cin >> a[i];
dp[1] = a[1]; //边界值
int left[maxn];
left[1] = 1; //记录序列起始于左侧的位置
int ans = 1;
for(int i = 2; i <= n; ++i)
{
dp[i] = max(a[i], a[i] + dp[i - 1]); //状态转移方程
if(a[i] > a[i] + dp[i - 1]) //即dp[i - 1]是负数
left[i] = i; //最大和连续子序列由a[i]即位置i开始
else //否则
left[i] = left[i - 1]; //以a[i]结尾最大和连续子序列起始处应该和以a[i - 1]为结尾的相同
}
bool flag = true; //判断是否全是负数
if(a[1] >= 0)
flag = false;
for(int i = 2; i <= n; ++i)
{
if(dp[i] > dp[ans])
ans = i;
if(a[i] >= 0)
flag = false;
}
if(flag == false)
cout << dp[ans] << ' ' << a[left[ans]] << ' ' << a[ans] << endl;
else
cout << 0 << ' ' << a[1] << ' ' << a[n] << endl;
return 0;
}