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

    以3*3的二维数组为例,可以推广到m*n的二维数组

    设计思路:

    1、初始化一个二位数组a[3][3];

    2、定义一个与数组a空间大小相同的数组b[3][3]。第一行b[0][0]=a[0][0],如果b[0][j]的前一个值小于0,b[0][j]=a[0][j];否则b[0][j]=b[0][j-1]+a[0][j]。第一列的情况与第一行类似。数组b[3][3]的其他值b[i][j]分别于b[i][j-1]、b[i-1][j]、b[i-1][j-1]有关,分为8种情况;

    3、从数组b[3][3]中找出最大值,为二维数组的最大子数组之和。

    代码如下:

    #include<iostream.h>
    int main()
    {
        int i,j;
        int a[3][3]={-1,-2,1,-3,4,2,3,4,-5};
        int b[3][3];
        int max=a[0][0];
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                cout<<a[i][j]<<' ';
            }
            cout<<endl;
        }
        cout<<endl;
        for(i=0;i<1;i++)
        {
            b[0][0]=a[0][0];
            for(j=0;j<3;j++)
            {
                if(a[0][j-1]<0)
                {
                    b[0][j]=a[0][j];
                }
                else
                {
                    b[0][j]=b[0][j-1]+a[0][j];
                }
            }
        }
        for(i=1;i<3;i++)
        {
            for(j=0;j<1;j++)
            {
                if(a[i-1][0]<0)
                {
                    b[i][0]=a[i][0];
                }
                else
                {
                    b[i][0]=b[i-1][0]+a[i][0];
                }
            }
        }
        for(i=1;i<3;i++)
        {
            for(j=1;j<3;j++)
            {
                if(b[i-1][j-1]<0)
                {
                    if(b[i-1][j]>=0&&b[i][j-1]>=0)
                    {
                        if(b[i][j-1]>=b[i-1][j])
                        {
                            b[i][j]=b[i][j-1]+a[i][j];
                        }
                        else
                        {
                            b[i][j]=b[i-1][j]+a[i][j];
                        }
                    }
                    else if(b[i-1][j]>=0&&b[i][j-1]<=0)
                    {
                        b[i][j]=b[i-1][j]+a[i][j];
                    }
                    else if(b[i-1][j]<=0&&b[i][j-1]>=0)
                    {
                        b[i][j]=b[i][j-1]+a[i][j];
                    }
                    else
                    {
                        b[i][j]=a[i][j];
                    }
                }
                else
                {
                    if(b[i-1][j]>=0&&b[i][j-1]>=0)
                    {
                        b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
                    }
                    else if(b[i-1][j]>=0&&b[i][j-1]<=0)
                    {
                        b[i][j]=a[i][j]+b[i-1][j]-b[i-1][j-1];
                    }
                    else if(b[i-1][j]<=0&&b[i][j-1]>=0)
                    {
                        b[i][j]=a[i][j]+b[i][j-1]-b[i-1][j-1];
                    }
                    else
                    {
                        b[i][j]=a[i][j];
                    }
                }
            }
        }
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                cout<<b[i][j]<<" ";
            }
            cout<<endl;
        }
        cout<<endl;
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                if(b[i][j]>max)
                    max=b[i][j];
            }
        }
        cout<<"max="<<max<<endl;
        return 0;        
    }

    小组成员:袁雪、王亚蕊

  • 相关阅读:
    浅析HSTS
    浅析Diffie–Hellman
    SSIM(结构相似度算法)不同实现版本的差异
    某直播App问题分析
    相机与摄影基础
    Macaca-iOS入门那些事2
    Macaca-iOS入门那些事
    iOS instruments trace文件解析方案
    关于QCon2015感想与反思
    深入浅出Android App耗电量统计
  • 原文地址:https://www.cnblogs.com/luan/p/3639453.html
Copyright © 2011-2022 走看看