求最大子数组02

题目:整数数组中最大子数组的和

要求:

  1. 输入一个整形数组,数组里有正数也有负数。
  2. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
  3. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
  4. 同时返回最大子数组的位置。 求所有子数组的和的最大值。

 

这次任务多了一个要求就是这个数组是环形的,

也就是可以从A[i-1],…… A[n-1],A[0],A[1]这样的数组也阔以,那么首先想到的就是循环链表,然后控制求和的子数组长度即可,但是,链表首元素从哪定呢。。。用DP的话终止条件怎么设置。。。

所以我感觉这个方法可能不太好走,于是,想到了既然是个环形的数组,那子数组也要有要求吧,如果数组元素全部之和为正,

那么一直循环下去求和子数组的和岂不是+∞,这样下去还能了得。。。

,子数组的长度一定小于等于原数组,那么两个数组Arr首尾相接构成的新数组肯定可以包含所有子数组,

然后再打表求所有子数组的和,再求max,这不手到擒来嘛,赶紧的码起

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 #define max_Num 100
 5 int main(int argc, char *argv[])
 6 {
 7     int a[]={115,15,-565,9465,-66,11,15,9400};
 8     vector<int> arr(a,a+(int)(sizeof(a)/sizeof(int)));
 9     arr.insert(arr.end(),arr.begin(),arr.end());
10     int arrtemp[max_Num][max_Num]={0};         //记录数列之和的表  arrtemp[i][j]表示为子数组arr中[i,j]元素之和
11     for(int i = 0;i <(int)(arr.size()/2); i++)
12     {
13         for(int j = 0;j<(int)(arr.size());j++)
14         {
15             if((i <= j) && (j < i + (int)(arr.size()/2)))  //i<=j控制元素顺序,j <i+length控制子数列长度
16             {
17                 for(int k = i; k <= j; k++)
18                 {
19                     arrtemp[i][j] += arr[k];
20                 }
21             }
22         }
23     }
24 
25     int maxtemp = arrtemp[0][0];   //临时最大值设为arr[0][0]即 arr[0]
26     int start = 0;
27     int end = 0;
28     for(int i = 0;i < (int)(arr.size()/2); i++)
29     {
30         for(int j = 0;j < (int)(arr.size());j++)
31         {
32             if((i <= j) && (j < (int)(i+arr.size()/2)))  //i<=j控制元素顺序,j<i+length控制子数列长度
33             {
34                 if( arrtemp[i][j] > maxtemp)
35                 {
36                     maxtemp = arrtemp[i][j];
37                     start = i;
38                     end = j;
39                 }
40             }
41         }
42     }
43 
44     cout <<"sum:"<< maxtemp <<"start:"<< start <<"end:"<<end % (arr.size() / 2) <<endl;
45     return 0;
46 }
(i <= j) && (j < (int)(i+arr.size()/2))是控制元素求和用的,比如一个数组有4个元素,那么求和打表的内容只能填充到
O O O O X X X X
X O O O O X X X
X X O O O O X X
X X X O O O O X
中 O 的位置,其他位置不可能是子数组之和。

这个程序的复杂度是O(n2) ,
然后注意的是存放临时子数组和的二位数组不能设置太大, 不然会内存溢出。。。。不懂啊 ,我才设1000*1000,就爆了,在QT creator上调试了好久也找不到错,拿到VS上就提示stack overflow
也是醉了。。
日期 听课 编程 读书 看代码 写博客 总结
星期一 120 120   150   390
星期二   60   120   180
星期三       90   90
星期四 120 120   60   300
星期五       120   120
星期六   60       60
星期日   240     90 330
周总结 240 600 0 540 90 1470













缺陷记录日志
日期 编号 类型 引入阶段 排除阶段 修复时间 修复缺陷
3/27 1 stack overflow 编码 调试 20min  






我的小组成员:刘伟
posted @ 2016-03-26 08:59  _Just  阅读(202)  评论(1编辑  收藏  举报