子数组最大和

#include<iostream>
using namespace std;
#define Nu 5

int main()
{
int max=0,s=0,t=Nu;
int a[Nu];
int b[Nu*(Nu+1)/2]={0};
int k;

cout<<"随机产生数组为:";
for(int i=0;i<Nu;i++)
{
k=rand()%2;
do
a[i]=rand();
while(a[i]>100);
a[i]=k==1?a[i]:-a[i];
max=a[i];
cout<<a[i]<<" ";
}
cout<<endl;
int M=0,N=Nu;
for(int i=0;i<Nu*(Nu+1)/2;i++)
{
for(int j=M;j<N;j++)
b[i]=b[i]+a[j];

if(b[i]>max)
{
max=b[i];
s=M;
t=N;
}

if(N==M+1)
{
N=Nu;
M=M+1;
}
else N=N-1;

}

cout<<"所有子数组和为:"<<endl;
for(int i=0;i<(Nu*(Nu+1)/2);i++)
cout<<b[i]<<endl;

cout<<"相邻子数组最大和为:"<<max<<endl;

cout<<"相应子数组为:";
for(int i=s;i<t;i++)
cout<<a[i]<<" ";
cout<<endl;

return 0;
}

思路:随机产生5个数存在数组a里,定义数组b来存储子数组的和,求和先求以第一个随机数开头的所有情况,再求以第二个数开头的所有情况,以此类推,

例如:随机数为1,2,3,4,5;先求

1,2,3,4,5

1,2,3,4

1,2,3

1,2

1

这几个子数组的和,然后继续求

2,3,4,5

2,3,4

2,3

2

以此类推,用Max记录和的最大值,用s,t来记录子数组的头尾序号,最后输出。

 

总结:刚开始完全没思路啊,题都看不懂啊,后来思路有了,想过用二维数组,想过用函数自调用,想过用指针,但是能力有限啊,根本实现不出来,

只能想简单的了。。。后来还是在上课的时候开小差就突然想到现在这个了,回来就试了试,就做完了,呵呵还是挺开心的,本来打算去看别人的思路

了,后来还是自己想的,虽然比较简单,但起码是自己做的吧

 

                                                                                                周活动总结表(第三周)

活动

上课

编写代码

看书

休息娱乐

总计

 周一

300

 

 

 

300

    周二

500

 

 

 

500

周三

100

 

 

 

100

周四

300

 

 

 

300

周五

200

 

 

300

500

周六

 

 

45

300

345

周日

 

115

 

 

115

总计

1400

115

45

600

2060

 

 

                                                                                                     时间记录日志

  日期

开始时间

结束时间

中断时间

净时间

活动

备注

21/3

23:10

23:20

 

10

找思路

完全没想出来

22/3

9:00

10:05

 

65

找思路

用函数自调用

 

10:05

1200

 

115

编程

没做出来,就此搁置,很消沉

23/3

9:25

9:45

 

20

上课

走神重新找思路

 

10:10

1130

 

80

编程、测试

呵呵哒,出来了

 

 

                                                                                                     缺陷记录日志

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

22/3

1

函数自调用不会

编码

编译

 

未修复出来

   22/3

2

循环混乱

编码

编译

2

 

 

3

变量赋值

编码

编译

1

填错了

posted @ 2015-03-23 12:56  夺命小五毛  阅读(141)  评论(1编辑  收藏  举报