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

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

    后感:其实这几次的作业都是在先前的作业的基础上加上些条件,所以应该将实现程序各功能的部分单独出来形成函数,待以后用的到的时候就可以直接调用,这样既简单又清楚明了。虽然思路清楚但是算法过于复杂,见到简单算法继续完善!

  • 相关阅读:
    随风而行(Android运动提示)
    Android简单的四则随机运算
    随手记(一)(六)
    随手记(五)
    随手记(四)
    随手记(三)
    随手记(二)
    痛点以及需求分析
    WC项目解析统计文本文件中的字符数、行数、单词数
    个人项目需求分析粉日记
  • 原文地址:https://www.cnblogs.com/xiangwo/p/4445759.html
Copyright © 2011-2022 走看看