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

    设计思想:综合了前面一维数组成环和二维数组求最大子数组的思想。

    屏幕截图:

    总结:

    把做过的程序封装成一个个的接口,当使用时直接调用即可。

    源代码:

    //jiangzhongxi 2015/4/16
    #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);
    }
  • 相关阅读:
    vmware 搭建内外网分开的三台centos7.9虚拟机
    CentOS 7 搭建frp内网穿透服务端
    CentOS 7 搭建frp内网穿透客户端
    Redis设计与实现读书笔记
    easyui 下拉框绑定成功之后,又无法显示
    easyui 实现后一个弹框向前一个弹框传值
    学会这七个Python GUI图形界面化库,就没有做不出来的界面!超有用!
    最新!用Python免费连接附近WiFi教程!没有我蹭不到的网!
    用Python实现九九乘法表的几种方式,入门必备案例!超级简单!
    为了每天准时看到冰冰,我用Python写了个自动提醒脚本,美滋滋!
  • 原文地址:https://www.cnblogs.com/xizhenghe/p/4451736.html
Copyright © 2011-2022 走看看