1 #include <stdio.h> 2 #include <stdlib.h> 3 /*求子数组最大和,时间复杂度o(n),数组有正、负整数*/ 4 /*分析,要求时间复杂度o(n),则只能读一次数组,顺序求解 5 *由于有正数,全部排除负和。 6 *可使用动态机分析。max(x[i])分两种状况,max(x[i-1])<=0和max(x[i-1])>0 7 */ 8 #define len(x) (sizeof(x)/sizeof(x[0])) 9 int bigsum_subarray(int *x, int len) 10 { 11 if(x == NULL || len <= 0) 12 return -1; 13 14 int i, total = 0, tmp = 0; 15 16 for(i = 0; i < len; i++){ 17 if(tmp <= 0) 18 tmp = x[i]; 19 else 20 tmp += x[i]; 21 if(tmp > total) 22 total = tmp; 23 } 24 return total; 25 } 26 int main(void) 27 { 28 int total, x[] = {1, -2, 3, -10, -4, 7, 15, -5}; 29 30 total = bigsum_subarray(x, len(x)); 31 32 printf("%d\n", total); 33 return 0; 34 }