求首位相连一维数组最大子数组的和

结对成员:

朱少辉:主要负责代码编写

侯涛亮:主要负责程序测试

题目:一个首尾相接的一维整型数组,其中有正有负,求它的最大子数组并返回它的位置。

思路:在求一维子数组的基础上,先输入一个含有N个数的一维数组,将此数组向后平移N个使数组长度变为2N个,前N个和后N个值相等。再求这长度为2N的数组最大子数组之和,也就是求从第i个(i=0,1,2..n-1)到第i+n(不包含i+n)个中求最大的子数组和。这样会从0-N-1产生产生N个最大子数组的和,把这N个值存到另个数组中,求出最大值即为首位衔接一维子数组的最大值。该算法的时间复杂度为o(n^2)。

代码:

#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;
  
}

截图

总结:这次的程序是上次程序的进化,具体思路还是一样的。由此可见许多程序的算法都是有关联的,我们要学会继承和创新。此外结对开发过程中,队友之间的配合,沟通,交流和信任也是十分重要的。通过几次的合作我们都有了很大的进步。

转载于:https://www.cnblogs.com/bingoing/p/4421671.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值