最大连续子段和首先想到就是动态规划
#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; }