#include <stdio.h>
int arr[10008];//保存原始数组
int dp[10008];//这个数组保存的是以i为结尾的最大子串的长度。
int begining[10008];//把以i为结尾的最大子串的开头下标保存下来。
int n;
bool allneg=1;
int main(){
//freopen("/Users/pantingting/Documents/code/data/input", "r", stdin);
scanf("%d",&n);
int max,maxj;
for (int i=0; i<n; i++) {
scanf("%d",&arr[i]);
if (arr[i]>=0) {
allneg=0;//表示并非全部负数
}
}
dp[0]=arr[0];//以0结尾的最大连续子串只能是arr【0】
begining[0]=0;
max=dp[0];
maxj=0;
for (int i=1; i<n; i++) {
if (dp[i-1]>0) {
dp[i]=arr[i]+dp[i-1];//如果以i-1为结尾的最大子串>0则包含上上一个以i-1为结尾的子串
begining[i]=begining[i-1];
}
else{
dp[i]=arr[i];//如果前面子串<0,那么以i为结尾的最大子串则为自己,若包含前面子串,得到的值更小
begining[i]=i;
}
if (dp[i]>max) {
max=dp[i];
maxj=i;
}
}
if (allneg) {
printf("%d %d %d\n",0,arr[0],arr[n-1]);
return 0;
}
printf("%d %d %d\n",dp[maxj],arr[begining[maxj]],arr[maxj]);
return 0;
}
PAT Maximum Subsequence Sum (25)
最新推荐文章于 2022-11-13 18:19:33 发布