//
// main.cpp
// PAT_1007. Maximum Subsequence Sum
//
// Created by wjq on 17/3/30.
// Copyright © 2017年 wjq. All rights reserved.
//
#include <iostream>
using namespacestd;
int main()
{
int K,d[10005],maxnum=-99999999,negativeFlag=true,s=0,minend=0,minstart=0;
cin>>K;
for(int i=0;i<K;i++)
{
cin>>d[i];
if(d[i]>=0)
negativeFlag=false;
}
int sum[10005];
sum[0]=d[0];
for(int i=1;i<K;i++)
sum[i]=max(sum[i-1]+d[i],d[i]);
for(int i=0;i<K;i++)
{
if(sum[i]>maxnum)
{
maxnum=sum[i];
minend=i;
}
}
for(int j=minend;j>=0;j--)
{
s+=d[j];
if(s==maxnum)
minstart=j;
}
if(negativeFlag==true)
cout<<0<<" "<<d[0]<<" "<<d[K-1];
else
cout<<maxnum<<" "<<d[minstart]<<" "<<d[minend];
}
很经典的简单动规题了,以前做过,所以很快就做好了,注意题目中提到的
output the one with the smallest indices i and j (as shown by the sample case).
意思是,你的序列的第一个元素和最后一个元素的下标尽可能的小.
我先找到了最后一个元素的下标,然后通过最后一个元素的下标往前加,一直到0,只要和与maxnum相等,就更新第一个元素的最小下标.
因为有可能出现这种情况
12
-10 5 -5 1 2 3 4 -5 -23 3 7 -21
输出应该是
10 5 4
而不是
10 1 4