• 求一循环数组的最大子数组的和


    解题思路:

    当数组是首尾相连时,求连续子数组最大和的方法可以归纳如下:

    1.将原数组进行扩充,即假设原数组为{1,2,-3,4,5},则扩充相当于{1,2,-3,4,5,1,2,-3,4,5}

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

    五 总结反思

           对于数组的理解更加深刻,团队合作很重要。

     

  • 相关阅读:
    <数据挖掘导论>读书笔记8FP树
    <数据挖掘导论>读书笔记7 Apriori算法
    c#:Json字符串转成xml对象
    微信公众平台开发
    一维随机变量及其概率分布
    概率的基本概念
    C#调用OCR组件识别图片文字
    增加系统右键菜单
    visual studio内置“iis”组件提取及二次开发
    《JavaScript权威指南》读书笔记——JavaScript核心
  • 原文地址:https://www.cnblogs.com/LJT666/p/4428253.html
Copyright © 2020-2023  润新知