码迷,mamicode.com
首页 > 编程语言 > 详细

课堂练习(循环数组的最大子数组和)

时间:2018-11-04 19:10:17      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:老师   return   inf   length   方式   unsigned   过程   ctime   分享图片   

#include <iostream>
#include<ctime>
#define Num 10000
using namespace std;
int DTGH_Sum(int a[],int n) //动态规划法求子段和函数
{
int sum = 0;
int *b = (int *) malloc(n * sizeof(int)); //动态为数组分配空间
b[0] = a[0];
for(int m = 1; m < n; m++)
{
if(b[m-1] > 0)
b[m] = b[m - 1] + a[m];
else
b[m] = a[m];
}
for(int j = 0; j < n; j++)
{
if(b[j] > sum)
sum = b[j];
}
delete []b; //释放内存
return sum;
}
int main()
{ int temp,b;
int sum=0;
int m;
int a1,a2;
int a[Num];
int length=0;
while (length==NULL||length == 0)//如果数组长度为空或零则请重新输入
{
cout<<"请输入数组长度:";
cin>>length;
}
cout<<"生成随机序列: "<<endl;
srand((unsigned)time(NULL));
for(m=0;m<length;m++)//产生随机序列
{
if(rand()%2==0)
{
a[m]=rand()%100;
}
else
{
a[m]=(-1)*rand()%100;
}
cout<<a[m]<<" ";
}
cout<<endl;
cout<<"此首尾相连的数组中最大子数组的和有以下几种可能:"<<endl;
cout<<"第1种排列方式:"<<endl;
for( m=0;m<length;m++)
{
cout<<a[m]<<" ";
}
cout<<"最大子数组和为:"<<DTGH_Sum(a,length)<<endl;
a1=DTGH_Sum(a,length);
for(b=1;b<length;b++)
{
temp=a[0];
for(m=1;m<=length;m++)
{
a[m-1]=a[m]; //将第一个数变为最后一个数

}
a[length-1]=temp;
cout<<"第"<<b+1<<"种排列方式:"<<endl;
for( m=0;m<length;m++)
{
cout<<a[m]<<" ";
}
cout<<"最大子数组和为:"<<DTGH_Sum(a,length)<<endl;
if(DTGH_Sum(a,length)>=sum)
{
sum=DTGH_Sum(a,length);
}
}
a2=sum;
cout<<endl;
if(a1>=a2)
{
cout<<"综上,最大的子数组和为:"<<a1<<endl;
}
else
{
cout<<"综上,最大的子数组和为:"<<a2<<endl;
}
return 0;
}技术分享图片

另一小组成员为梁明宇,其中我(陈岩)负责程序分析,代码编写。梁明宇负责代码复审和代码测试计划。

设计思想为老师上课提到的遍历数组里面的每一个数将第一个数变为最后一个数,这样又变成了一个新的一维数组,输出每个数组的最大子数组和,然后比较每个输出的和,找出最大的数。

其中遇到的问题是申请动态空间未释放(通过询问有malloc函数方法还有我们所用到的方法)。

总结:在这次编译代码的过程中,参照了老师上课讲的内容,并且辅助了一些网上资源,在不断的磕磕绊绊的编译修改过程中完成了这次的代码编写任务,在不断地磨合过程中进步。

 技术分享图片

 

课堂练习(循环数组的最大子数组和)

标签:老师   return   inf   length   方式   unsigned   过程   ctime   分享图片   

原文地址:https://www.cnblogs.com/chenchen21/p/9904492.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!