0和一堆负数的问题
http://www.patest.cn/contests/mooc-ds/01-2
/*
title:01-2问题分类:最大子序列
*/
#include<stdio.h>
int main(){
freopen("in.txt","r",stdin);
int zu;
int a[10001];
//f表示以i结尾的和最大值,但是感觉这样描述不太正确,因为f中还有负数
int f[10001];
while(scanf("%d",&zu)!=EOF){
for(int i=0;i<zu;i++){
scanf("%d",&a[i]);
}
//所有数字都是负数
int cnt=0;
for(int i=0;i<zu;i++){
if(a[i]<0){
cnt++;
}
}
if(cnt==zu){
printf("%d %d %d\n",0,a[0],a[zu-1]);
continue;
}
int max=0,cj=0;
f[0]=a[0];
if(f[0]>max){
max=f[0];
}
for(int i=1;i<zu;i++){
if(f[i-1]<0){
f[i]=a[i];
}else{
f[i]=f[i-1]+a[i];
}
if(f[i]>max){
max=f[i];
cj=i;
}
}
int ci=cj;
for(int i=cj;i>=0;i--){
if(f[i]>0){
ci=i;
}else{
break;
}
}
//有0和负数存在的情况
if(max==0){
printf("%d %d %d\n",0,0,0);
}else{
printf("%d %d %d\n",max,a[ci],a[cj]);
}
}
return 0;
}
发现个更简单的方法
先找尾巴,在根据和找头
#include<stdio.h>
int main(){
int k;
int buf[100001];
int thisSum=0,maxSum=-1;
int start=0,end=0;
while(scanf("%d",&k)!=EOF){
for(int i=0;i<k;i++){
scanf("%d",&buf[i]);
}
for(int i=0;i<k;i++){
thisSum+=buf[i];
if(thisSum>maxSum){
maxSum=thisSum;
end=i;
}
else if(thisSum<0){
thisSum=0;
}
}
int sum=0;
for(int i=end;i>=0;i--){
sum+=buf[i];
if(sum==maxSum){
start=i;
}
}
if (maxSum <0){
printf("0 %d %d",buf[0],buf[k-1]);
}else
printf("%d %d %d",maxSum,buf[start],buf[end]);
}
return 0;
}