这题第一次提交即AC
题意
输出最大连续子序列和及其开头元素和结尾元素
思路
动态规划 or 贪心?
begin[]
保存presum这个元素的当前最大子序列的开头元素序号
presum[]
保存包括当前元素在内的之前所有元素的最大和,对每一个元素,若加上前一个元素的presum能比自己当前大,就加上,并且更改自身的begin为前一个元素的begin;否则presum等于自身,begin等于自身序号
AC代码
#include <iostream>
using namespace std;
int main(){
int n;
bool flag=false;
int seq[10005];
int presum[10005];
int begin[10005];
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&seq[i]);
presum[i] = seq[i];
if(seq[i]>=0) flag=true;
}
if(flag==false){
printf("0 %d %d",seq[0],seq[n-1]);
return 0;
}
begin[0]=0;
for(int i=1;i<n;i++){
if(presum[i]+presum[i-1]>=presum[i]){
presum[i]=presum[i]+presum[i-1];
begin[i] = begin[i-1];
}
else begin[i]=i;
}
int max=presum[0],end=0;
for(int i=0;i<n;i++){
if(presum[i]>max){
max = presum[i];
end = i;
}
}
printf("%d %d %d",max,seq[begin[end]],seq[end]);
return 0;
}