思路:

采用动态规划进行求解,令:

maxSum[k]表示子串list{0,k}的最大连续子串和,

maxSumIncludeK[k]表示子串list{0,k}中末尾为k的最大连续子串和,

maxSumIncludeK[k] = max(list[k],list[k]+maxSumIncludeK[k-1]),

maxSum[k] = max(maxSumIncludeK[k],maxSum[k-1])。

代码:

 
  
  1. #include <stdlib.h> 
  2. #include <stdio.h> 
  3.  
  4. int MaxSubList(int list[],int length) 
  5.     int i; 
  6.     //maxSum[k]表示子串list{0,k}的最大连续子串和 
  7.     //maxSumIncludeK[k]表示子串list{0,k}中末尾为k的最大连续子串和 
  8.     int* maxSum = (int*)malloc(sizeof(int)*length); 
  9.     int* maxSumIncludeK = (int*)malloc(sizeof(int)*length); 
  10.     for (i=0;i<length;i++) 
  11.     { 
  12.         maxSum[i] = 0; 
  13.         maxSumIncludeK[i] = 0; 
  14.     } 
  15.     if (list[0]>0) maxSum[0] = list[0]; 
  16.     maxSumIncludeK[0] = list[0];     
  17.     for (i=1;i<length;i++) 
  18.     { 
  19.         maxSumIncludeK[i] = list[i]; 
  20.         if (maxSumIncludeK[i-1]>0) maxSumIncludeK[i]+=maxSumIncludeK[i-1]; 
  21.         if (maxSumIncludeK[i]>maxSum[i-1]) maxSum[i] = maxSumIncludeK[i]; 
  22.         else maxSum[i] = maxSum[i-1]; 
  23.     } 
  24.     return maxSum[length-1]; 
  25.  
  26. int main() 
  27.     int list[20] = {4,9,-4,3,2,-1,-6,7,2,-3,1,5,3,-2,7,-3,9,2,-4,2}; 
  28.     printf("max sum:%d \n",MaxSubList(list,20)); 
  29.     return 0; 
  30. }