Chinaunix首页 | 论坛 | 博客
  • 博客访问: 77165
  • 博文数量: 32
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 284
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-26 14:00
个人简介

有梦想的人,正在努力

文章分类

全部博文(32)

文章存档

2015年(32)

我的朋友

分类: C/C++

2015-05-16 13:39:57

        这道题很简单。开始时,将cursum和maxsum赋值为nums[0]。 然后将后面的数继续加在cursum上,如果cursum大于maxsum,就把maxsum赋值为cursum, 如果cursum小于零,说明cursum会对后面的子数组产生减小的效果。
        还有需要确定最大子数组的起始位置,结束的位置很好确定,开始的位置需要从最大子数组的最后一个往前加,如果加到等于maxsum了,那么这个就是起点了。

源码如下:

  1. #include <stdio.h>
  2. long long maxSubArray(int *, int);
  3. int start, end, i;
  4. int main()
  5. {
  6.     int n, t, ct = 1;
  7.     int nums[100001];
  8.     scanf("%d", &t);
  9.     while(t--)
  10.     {
  11.         start = 1;
  12.         end = 1;
  13.         scanf("%d", &n);
  14.         for(i = 0; i < n; ++i)
  15.             scanf("%d", &nums[i]);
  16.         printf("Case %d:\n", ct++);
  17.         long long maxsum;
  18.         printf("%lld ", maxsum = maxSubArray(nums, n));
  19.         long long sum = 0;
  20.         for(i = end - 1; i >= 0; --i)
  21.         {
  22.             sum += nums[i];
  23.             if(sum == maxsum) start = i + 1;
  24.         }
  25.         printf("%d %d\n", start, end);
  26.         if(0 != t) printf("\n");
  27.     }
  28.     return 0;
  29. }

  30. long long maxSubArray(int * nums, int n)
  31. {
  32.     long long cursum = nums[0];
  33.     long long maxsum = nums[0];
  34.     for(i = 1; i < n; ++i)
  35.     {
  36.         if(cursum < 0)
  37.         {
  38.             cursum = 0;
  39.             start = i + 1;
  40.         }
  41.         cursum += nums[i];
  42.         if(cursum > maxsum)
  43.         {
  44.             maxsum = cursum;
  45.             end = i + 1;
  46.         }
  47.     }
  48.     return maxsum;
  49. }


阅读(475) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~