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

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

        }

    }

    成员:宋雨佳  周雪莹

    思路:从第一行开始,加一行加两行,一直将所有的二维数组转换成几个一维数组,再将上次做的一维数组首尾相接最大字数组合做成函数调用。

    感受:每次都是她来编程,下次我一定自己编,不管能不能做出来吧,总得试试。

  • 相关阅读:
    centos7-关闭 rpcbind 服务
    nginx进行获取阿里云slb真实ip配置操作
    rsync同步时,删除目标目录比源目录多余文件的方法(--delete)
    nfs安装
    Selenium+PhantomJS使用时报错原因及解决方案
    python json转对象 指定字段名称
    大地坐标系和空间直角坐标系的转换
    python日志输出的内容修改为json格式
    Java String的intern方法
    python 超时重试的方法 signal手段
  • 原文地址:https://www.cnblogs.com/xiaowumao/p/4448325.html
Copyright © 2011-2022 走看看