标签:
一 题目:一个首尾相接的一维整型数组,其中有正有负,求它的最大子数组并返回它的位置。
结对开发人员:朱少辉,侯涛亮
二 设计思路:设这个数组为a[n],那么扩大数组范围,使之为a[2*n],将a[0]~a[n-1]的值赋给a[n]-a[2*n-1],那么就相当于从第i个(i=0,1,2..n-1)到第i+n(不包含i+n)个中求最大的子数组,这时可以用到求一维数组(不是环)最大子数组动态规划的思想求解,每求得一个最大值进行比较,最后可求得最大子数组。至于求位置即最大子数组下标,可以附设一个指针j指向最大子数组末尾,指针每回溯一次,就令最大值max减去a[j],直到max值为0,就能求得最大子数组的首部下标。
三 代码
#include<iostream> #include<cmath> using namespace std; void main() { int a[25000],i,j,n,MaxSum,k,m,h,p; int f=0; int b[10],d[10]; cout<<"请输入数组中数字的个数"<<endl; cin>>n; cout<<"请输入数组"<<endl; for(i=0;i<n;i++) { cin>>a[i]; } for(i=n;i<2*n;i++) { a[i]=a[i-n]; } cout<<endl; for(i=0;i<n;i++) { k=0; MaxSum=0; h=i; for(j=i;j<i+n;j++) { k += a[j]; if(k > MaxSum) { MaxSum = k; h=j; } if(k < 0) { k = 0; } } d[i]=h; b[i]=MaxSum; } int c=b[0]; m=0; h=0; for(i=1;i<n;i++) { if(c<=b[i]) { c=b[i]; m=i; h=d[i]; } } p=h-n+1; if(p<=0) { p=n;} cout<<"从第"<<m+1<<"个到第"<<p<<"个"<<endl; cout<<"最大子数组为"<<endl; for(i=m;i<h+1;i++) { cout<<a[i]<<" ";} cout<<endl; cout<<"最大子数组之和为"<<c<<endl; }
四 截图
五 总结反思
在这次结对开发中,我和伙伴相互思考设计思路,然后交流意见,达成了设计思路的共识。这样的开发流程,不仅促进了我们之间交流,而且提高了我们的编程能力,可见团队合作的重要性。
标签:
原文地址:http://www.cnblogs.com/houtaoliang/p/4421532.html