zoukankan      html  css  js  c++  java
  • 首尾相连的二维数组求最大字数组的和

    题目:
          返回一个二维整数数组中最大子数组的和。
    要求:
          输入一个二维整形数组,数组里有正数也有负数。
          二维数组首尾相接,象个一条首尾相接带子一样。
          数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
          求所有子数组的和的最大值。
    思路:从第一行开始,加一行加两行,一直将所有的二维数组转换成几个一维数组,再将上次做的一维数组首尾相接最大字数组合做成函数调用。

    (1)代码:

    #include<iostream>
    using namespace std;
    #define N 4

    void maxhe(int a[],int &s,int &jmin,int &jmax)
    {
        int sum=a[0],b=a[0],x=0,y=0;
        int    j=1;
        while((j-x<N)&&x<N) 
        { 
            if(b>=0)         
            {
                b=a[j%N];
                if(j<N)
                    x=j;
                else
                    break;
            } 
            else 
                b+=a[j%N]; 
            if(sum>=b) 
            { sum=b;y=j;} 
            j++;
        }
        sum=0;
        for(int i=y+1;i<x+N;i++)
            sum+=a[i%N];
        s=sum;jmin=y+1;jmax=x+N-1;
        int z=y%N;
        if(x>=z)
        {
            j=1;sum=a[0];b=a[0];x=0;y=0;
            while(j<N) 
            { 
                if(b<0)         
                { b=a[j%N];x=j;} 
                else 
                    b+=a[j%N]; 
                if(sum<=b) 
                { sum=b;y=j;} 
                j++;
            }
           
            s=sum;jmin=x;jmax=y;
        }
        else if((x==0)&&(y==(N-1)))
        {
            sum=a[0];b=a[0];x=0;y=0;
            for(int o=1;o<N;o++)
            {
                if(a[o]>sum)
                {sum=a[o];x=o;y=o;}
            }
            s=sum;jmin=x;jmax=y;
        }
    }

    int main()
    {
        int a[N][N];
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<N;j++)
            {
                a[i][j]=rand()%6;
                if(rand()%2==1)
                    a[i][j]=a[i][j]*(-1);
            }
        }
        cout<<"随机生成的二维数组为:"<<endl<<endl;
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<N;j++)
            {
                cout<<a[i][j]<<";
            }
            cout<<endl;
        }///////////////////////////////////////////////二维数组生成
       
       
        int max=a[0][0],c1=0,c2=0,l1=0,l2=0;
        for(int i=0;i<N;i++)
        {
            for(int j=i;j<N;j++)
            {
                int b[N]={0};////////////////定义可以存放各行相加和的数组
                for(int k=0;k<N;k++)
                {
                    for(int l=i;l<=j;l++)
                    {
                        b[k]+=a[l][k];
                    }
                    cout<<b[k]<<" ";

                    int s=b[0],jmin=0,jmax=0;
                    maxhe(b,s,jmin,jmax);
                    if(s>=max)
                    {max=s;c1=jmin;c2=jmax;l1=i;l2=j;}
                }
                cout<<endl;
            }
        }

        cout<<"二维数组最大和为:"<<max<<endl;
        for(int i=l1;i<=l2;i++)
        {
            for(int j=c1;j<=c2;j++)
            {
                cout<<a[i][j%N]<<";
            }
            cout<<endl;
        }
    }

  • 相关阅读:
    MongoDB的查询
    商品订购及货物采购信息系统(代码分析)
    Java连接数据库(mysql,sqlserver)
    开通博客第一天
    Ubuntu下java环境的搭建
    商品订购及货物采购信息系统(需求分析)
    GitHub客户端发布托管代码
    property中copy和strong修饰符的使用指北
    iOS界面间传值
    GPUImage的滤镜功能一览表
  • 原文地址:https://www.cnblogs.com/LJT666/p/4520495.html
Copyright © 2011-2022 走看看