最大连续子段和

最大连续子段和首先想到就是动态规划

#include<stdio.h>
#define LEN 100001
int t ,num[LEN], res[LEN], start, end, max = -100000000;

int read_data(){
    int i;
    if(scanf("%d", &t) == EOF) return 0;
    if(t <= 20 && t >= 1){
        scanf("%d", &num[0]);
        if(num[0] >= 1 && num[0] <= 100000)
            for(i = 1; i <= num[0]; i++) 
                scanf("%d", &num[i]);
    }
    return 1;
}

void max_sum(){
    int i, j;
    for(i = 1; i <= num[0]; i++){
        res[i] = num[i];
        for(j = i + 1; j < num[0]; j++){
            res[j] = num[j] + res[j-1];
            if(res[j] > max){
                max = res[j];
                end = j;
                start = i;
            }
        }
    }
}

 但不许要这么麻烦,只要定义三个变量,一个表示最大的字段和,一个表示目前求得的字段和,一个表示目前子段的开始位置,从a0开始向右扫描,不断地加,当目前子段和大于最大的时更新最大子段和,若是当加到ai时和小于或等于0时,则从ai+1从新开始加起。代码如下

#include<stdio.h>

int main()
{
 int i,j,k=0,t,n,a,start,end,max,temp;
 scanf("%d", &t);
 for(i=0;i<t;i++)
 {
  max=-t,temp=start=k=0;
 scanf("%d", &n);
  for(j=0;j<loop2;j++)
  {
    scanf("%d", &a);
   temp+=a;
   if(temp>max)
   {
    start=k;
    end=j;
    max=temp;
   }
   if(temp<0)
   {
    temp=0;
    k=j+1;
   }
  }
  printf("%d %d %d", max, start, end );
 }
 return 0;
}

 

 

posted on 2013-03-09 13:47  于敬晖  阅读(952)  评论(0编辑  收藏  举报

导航