zoukankan      html  css  js  c++  java
  • 求二维数组环的最大的子数组的和

    #include<iostream>
    using namespace std;
    void max(int row,int col)
    {
    
        int ** a=new int*[row+1];
        int ** b=new int*[row+1];
        int h;//用于每一个一维数组上已经相加元素的个数够一个环则开始下一个
        for(int i=1;i<=row;i++)
        {
            a[i]=new int[2*col];
        }
        for(int i=1;i<=row;i++)
        {
            b[i]=new int[2*col];
        }
        cout<<"请输入"<<row<<""<<col<<"列的数组的元素"<<endl;
    
        int count=0;
        for(int i=1;i<=row;i++)
        {
            for(int j=1;j<=col;j++)
            {
                cin>>a[i][j];
                b[i][j]=a[i][j];
                if(a[i][j]<0)
                {
                    count++;
                }
            }
        }
        for(int i=1;i<=row;i++)//将二维数组加倍成环
        {
            for(int j=col+1;j<=2*col-1;j++)
            {        
                a[i][j]=a[i][j-col];
            }
        }
        /*cout<<"所输入的数组为:"<<endl;
        for(int i=1;i<=row;i++)
        {
            for(int j=1;j<=2*col-1;j++)
            {        
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }*/
        int k,n=2;
        if(count<row*col)//即不是所有的元素都是负数的情况
        {
            int sum=0;
          for(int m=1;m<=row;m++)
          {
            k=n;
            for(int i=1;i<=row;i++)
           {
             for(int j=1;j<=2*col-1;j++)
            {
                b[i][j]=a[i][j];
            }
           }//b[i]是经过元算后的数组而a[i]用于保留原数组
            for(int i=m;i<=row;i++)
           {
            while(k<=i)//只有在行数大于等于2时才出现两行相加
            {
              for(int j=1;j<=2*col-1;j++)
             {
                    b[k][j]=b[k-1][j]+b[k][j];
             }
              k++;
            }
          }
            /*cout<<"b"<<endl;
            for(int i=1;i<=row;i++)
           {
             for(int j=1;j<=2*col-1;j++)
            {
                
                cout<<b[i][j]<<" ";
            }
            cout<<endl;
           }*/
            n++;
            
         for(int i=m;i<=row;i++)
          {
              int c=0;
              h=1;
              while(h<=col)
              {
               for(int j=h;j<=col-1+h;j++)
               {
                 if(c<0)
                {
                    c=b[i][j];
                }
                else
                {
                
                    c=c+b[i][j];
                }
               if(sum<c)
               {
                 sum=c;
               }
               //cout<<sum<<"  ";
              }
              h++;
              c=0;//一圈结束c清零sum保持
             }
            
         }
        }
        cout<<endl;
        cout<<"最大子数组的和为:"<<sum;
        }
        else
        {
            int sum=a[1][1];
        
           for(int i=1;i<=row;i++)
          {
            for(int j=1;j<=col;j++)
            {
               if(a[i][j]>sum)
               {
                   sum=a[i][j];
               }
            }
          }
                  cout<<endl;
        cout<<"最大子数组的和为:"<<sum;
        }
        for(int i=1;i<=row+1;i++)//删除动态数组
        {
            delete []a[i];
            a[i]=NULL;
        }
        for(int i=1;i<=row+1;i++)//删除动态数组
        {
            delete []b[i];
            b[i]=NULL;
        }
    }
    void main()
    {
        int row,col;//行和列数
         cout<<"请输入数组的行数和列数:";
        cin>>row>>col;
        max(row,col);
    }

    结果截图:

  • 相关阅读:
    将才和帅才之的区别
    百胜集团XX:BPM实现业务流程全过程无缝链接(案例)
    心、肝、脾、肺、肾五脏解说+ 五脏六腑的作用
    人体的五行属性
    易经卦的通例
    《孙子兵法》中的企业领导艺术和方法
    五行盘谱
    大容量高并发性服务器组的技术解析
    中华哲学的领导艺术
    如何在WINDOW环境下搭建ActivateMQ和zookeeper集群环境
  • 原文地址:https://www.cnblogs.com/yuntianblog/p/4456077.html
Copyright © 2011-2022 走看看