Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244808
  • 博文数量: 62
  • 博客积分: 973
  • 博客等级: 准尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-16 23:25
文章分类

全部博文(62)

文章存档

2013年(1)

2012年(14)

2011年(47)

分类: C/C++

2011-12-08 16:00:31

  1. #include <stdio.h>

  2. #define MAXBETWEEN(a,b) ((a)>(b) ? (a):(b))
  3. #define MIN_INT -65535

  4. int maxSubSum(int a[], int len)
  5. {
  6.     int curSum=0, maxSum;
  7.     int i;
  8.     if(NULL == a || 0 == len)
  9.         return -MIN_INT;

  10.     maxSum = a[0]; // not

  11.     for(i=0; i<len; ++i)
  12.     {
  13.         // if '+=a[i-1]' make curSum<0, curSum=a[i]
  14.         if(curSum < 0)
  15.             curSum = a[i];
  16.         else
  17.             curSum += a[i];
  18.         if(maxSum < curSum)
  19.             maxSum = curSum;
  20.     }

  21.     return maxSum;
  22. }

  23. // deprecated
  24. int maxsum(int a[], int len)
  25. {
  26.     int cur, max, i;
  27.     cur=max=a[0];
  28.     for(i=1; i<len; ++i)
  29.     {
  30.         cur += a[i];
  31.         if(cur > max)
  32.             max = cur;
  33.         else if(cur < 0)
  34.             cur = 0; // not a[i] !!
  35.     }
  36.     return max;
  37. }

/* 我们试着再观察这个数组的特点,一个元素一个元素的看。
*  根据A[0]是否在这个满足最大和的子数组中,我们可以分为两种情况。
* 1.       在。那么可以从A[0]开始求(比较容易)。
* 2.       不在。那么这种情况,又可以继续分为两种情况:A[1]在不在这个满足最大和的子数组中。
* 从这里我们可以观察出一种递归的特点,可以把一个规模为N的问题转化为规模为N-1的问题。
* 所以这个从A[0]到A[n-1]的最大和子数组问题分解成:
*   2.1    所求子数组中包含A[0]。如果不包含A[1],则A[0]自己满足条件,此时Max(A[0]……A[n-1])=A[0]。
*   如果包含A[1],则Max(A[0]……A[n-1])=A[0]+Max(A[1]……A[n-1])。
*   2.2    所求子数组中不包含A[0]。Max(A[0]……A[n-1])=Max(A[1]……A[n-1])。
* 最后取以上三者的最大值即可
* 即Max(A[0]……A[n-1])=max( A[0], A[0]+Max(A[1]……A[n-1]), Max(A[1]……A[n-1]))。
*/

 

  1. // luisliu.blog.51cto.com/883990/227200
  2. int maxSubSum2(int a[], int n)
  3. {
  4.     int i;
  5.     int cur, max;
  6.     
  7.     if(NULL == a || 0 == n)
  8.         return MIN_INT;

  9.     cur = a[n-1];
  10.     max = a[n-1];
  11.     for(i=n-2; i>=0; --i)
  12.     {
  13.     // 要么最大和只包括a[i]自己,要么就是a[i]连上后面那个a[i+1]
  14.         cur = MAXBETWEEN(a[i], a[i]+cur);
  15.     // 最大和,要么是从i开始的,要么就还是从前的
  16.         max = MAXBETWEEN(cur, max);
  17.     }
  18.     return max;
  19. }

  20. int selectMaxSubArr(int data[], int len, int *left, int *right)
  21. {
  22.     int sum, maxchild, i;
  23.     sum = 0;
  24.     maxchild = data[0];
  25.     if(NULL == a || 0 == len)
  26.         return MIN_INT;

  27.     for(i=0; i < len; ++i)
  28.     {
  29.         if(sum < 0)
  30.         {
  31.             sum = data[i];
  32.             *left = i;
  33.         }
  34.         else
  35.         {
  36.             sum += data[i];
  37.         }

  38.         if(maxchild < sum)
  39.         {
  40.             maxchild = sum;
  41.             *right = i;
  42.         }
  43.     }
  44.     if(maxchild < 0)
  45.         *left = *right;

  46.     return maxchild;
  47. }

  48. int main()
  49. {
  50.     int a[10] = {1, -2, 3, 10, -4, 7, 2, -5};
  51.     // max sum of sub array is sum{3,10,-4,7,2} = 18.
  52.     
  53.     //int a[10] = {-2, -12, -3, -10, -4, -7, -1, -5};
  54.     // max sum of sub array is -1.

  55.     int left=0,right=0; //selectMaxSubArr
  56.     //printf("max-sum of child array is: %d\n", maxSubSum2(a, 8));
  57.     printf("max-sum is: %d\n", selectMaxSubArr(a, 8, &left, &right));
  58.     printf("The max of sub array(0..n-1) is from %d to %d.\n", left, right);
  59. }
阅读(1332) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~