课堂练习
代码调试出来了,时间复杂度为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 }