[九度][何海涛] 最大子向量和
- 题目描述:
-
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 }