[九度][何海涛] 最大子向量和

题目描述:

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?

 

输入:

输入有多组数据,每组测试数据包括两行。

第一行为一个整数n(0<=n<=100000),n=0,输入结束。接下去的一行包含n个整数(我们保证所有整数属于[-1000,1000])

 

 

 

 

输出:

对应每个测试案例,需要输出3个整数单独一行,分别表示连续子向量的最大和、该子向量的第一个元素的下标和最后一个元素的下标。若是存在多个子向量,则输出起始元素最小的那个。

 

样例输入:
3
-1 -3 -2
5
-8 3 2 0 5
8
6 -3 -2 7 -15 1 2 2
0
样例输出:
-1 0 0
10 1 4
8 0 3


经典问题

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <climits>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int n;
 9     int num[100000];
10     while(scanf("%d", &n) != EOF)
11     {
12         if (n == 0)
13             break;
14 
15         int maxSum = INT_MIN;
16         int sum = 0;
17         int start = -1;
18         int end;
19         int curStart;
20         int curEnd;
21         for(int i = 0; i < n; i++)
22         {
23             scanf("%d", &num[i]);
24             if (sum + num[i] > num[i])
25             {
26                 sum += num[i];
27                 if (sum > maxSum)
28                 {
29                     maxSum = sum;
30                     end = i;
31                     start = curStart;
32                 }
33                 else if (sum == maxSum)
34                 {
35                     if (num[start] > num[curStart])
36                     {
37                         start = curStart;
38                         end = i;
39                     }
40                 }
41             }
42             else
43             {
44                 sum = num[i];
45                 curStart = i;
46                 if (sum > maxSum)
47                 {
48                     maxSum = sum;
49                     start = curStart;
50                     end = i;
51                 }
52                 else if (sum == maxSum)
53                 {
54                     if (num[start] > num[curStart])
55                     {
56                         start = curStart;
57                         end = i;
58                     }
59                 }
60             }
61         }
62 
63         cout << maxSum << ' ' << start << ' ' << end << endl;
64     }
65 }

 

posted @ 2012-11-22 12:13  chkkch  阅读(398)  评论(0编辑  收藏  举报