课堂练习

代码调试出来了,时间复杂度为O(n),只是不知道为什么输出子序列的时候有时候无法输出,在这里请教各位大神啊,在这里面算法思想是这样的,如果当前序列加到小于零了则直接舍去前面的,其中要知道只要前几位是负数,则一定不是最大子序列,

 1 #include<iostream>
 2 #include<ctime>
 3 #include<stdlib.h>
 4 using namespace std;
 5 void main()
 6 {
 7     long int begin;//子序列的开头
 8     long int end;//子序列的结尾
 9     int newsum;//当前子序列最大值
10     int maxsum;//子序列最大值
11     srand((unsigned)time(NULL));//生成随机数
12     int a[1000], i, n;
13     /*begin = 0;
14     end = 0;*/
15     newsum = 0;//初始化
16     maxsum = a[0];//初始化
17     cout << "请输入数组里面包含数的个数:" << endl;
18     cin >> n;
19     for (i = 0; i < n; i++)
20     {
21         a[i] = rand() % 21 - 10;
22     }
23     cout << "数组a[" << n << "]为:";
24     for (i = 0; i < n; i++)
25     {
26         cout << a[i] << " ";
27     }
28     cout << endl;
29 
30     for (i = 0; i<n; i++)//开始循环求子序列和
31     {
32         newsum = newsum + a[i];
33         if (newsum > maxsum)//更新当前子序列的和
34         {
35             maxsum = newsum;
36             end = i;
37         }
38         if (newsum < 0)//假若当前子序列和为负,则舍弃
39         {
40             begin = i + 1;
41             newsum = 0;
42 
43         }
44     }
45     cout << "最大的子序列和为:" << maxsum << endl;
46     cout << "最大的序列为:";
47     for (long int k = begin; k <= end; k++)
48     {
49         cout << a[k] << " ";
50     }
51     cout << endl;
52 
53 }

原文地址:https://www.cnblogs.com/chengchengshuaio/p/4359308.html