传送门:HDU 1231 最大连续子序列
分析:
逻辑模拟,注释见代码。
#include<stdio.h>
#include<string.h>
int a[10000];
int main() {
int n,fir,end,i,j,max,sum=0,re,index;
while((scanf("%d",&n)) && n) {
for(i=0;i<n;i++)
scanf("%d",&a[i]);
fir = a[0];
end = a[0];
max = a[0];
re = 0;
for(i=0;i<n;i++) {
if(re<0) { // 小于0了,则重新开始记录子序列(比不选任何一个还要差)
re = a[i];
index = a[i]; // 记录区间的开始值
}
else
re += a[i];
if(re>max) { // 只有子序列的和大于max才更新相应的首尾
max = re; // 更新最大子序列的和
end = a[i]; // 更新区间的结束值
fir = index; // 更新区间的开始值
}
}
if(max<0)
printf("0 %d %d\n",a[0],a[n-1]);
else
printf("%d %d %d\n",max,fir,end);
}
return 0;
}