您的位置:首页 > 其它

求最大子数组02

2016-03-27 08:59 148 查看
题目:整数数组中最大子数组的和

要求:

输入一个整形数组,数组里有正数也有负数。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。

同时返回最大子数组的位置。 求所有子数组的和的最大值。

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

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

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

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

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

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

#include <iostream>
#include <vector>
using namespace std;
#define max_Num 100
int main(int argc, char *argv[])
{
int a[]={115,15,-565,9465,-66,11,15,9400};
vector<int> arr(a,a+(int)(sizeof(a)/sizeof(int)));
arr.insert(arr.end(),arr.begin(),arr.end());
int arrtemp[max_Num][max_Num]={0};         //记录数列之和的表  arrtemp[i][j]表示为子数组arr中[i,j]元素之和
for(int i = 0;i <(int)(arr.size()/2); i++)
{
for(int j = 0;j<(int)(arr.size());j++)
{
if((i <= j) && (j < i + (int)(arr.size()/2)))  //i<=j控制元素顺序,j <i+length控制子数列长度
{
for(int k = i; k <= j; k++)
{
arrtemp[i][j] += arr[k];
}
}
}
}

int maxtemp = arrtemp[0][0];   //临时最大值设为arr[0][0]即 arr[0]
int start = 0;
int end = 0;
for(int i = 0;i < (int)(arr.size()/2); i++)
{
for(int j = 0;j < (int)(arr.size());j++)
{
if((i <= j) && (j < (int)(i+arr.size()/2)))  //i<=j控制元素顺序,j<i+length控制子数列长度
{
if( arrtemp[i][j] > maxtemp)
{
maxtemp = arrtemp[i][j];
start = i;
end = j;
}
}
}
}

cout <<"sum:"<< maxtemp <<"start:"<< start <<"end:"<<end % (arr.size() / 2) <<endl;
return 0;
}


(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
也是醉了。。

日期听课编程读书看代码写博客总结
星期一120120150390
星期二60120180
星期三9090
星期四12012060300
星期五120120
星期六6060
星期日24090330
周总结2406000540901470
缺陷记录日志

日期编号类型引入阶段排除阶段修复时间修复缺陷
3/271stack overflow编码调试20min
我的小组成员:刘伟
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: