返回一个二维整数数组中最大子数组的和(头尾相接)

1.题目。

题目:返回一个二维整数数组中最大子数组的和。
要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

2.设计思想。

  分别求出每一行的最大子矩阵,然后再两行相加,求出最大子矩阵,一直到所有的行相加,求出最大子矩阵。比较其中最大的子矩阵值,找出最大的。

3.代码。

#include<iostream>
using namespace std;
#include <ctime>
#include <cstdlib>
#define MAX 10000 
int Max(int b[])
{
    int m[MAX],n=0,p=0;
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            n=n+b[i+j];
            m[p]=n;
            p++;
        }
        n=0;
    }
    int max=m[0];
    for(i=0;i<p;i++)
    {
        if(m[i]>max)
            max=m[i];
    }
    return max;
}

int main()
{
    int k[MAX],a[4][8],h[8];
    srand(time(0));
    cout<<"该矩阵为:"<<endl;
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            a[i][j]=rand()%100-50;
            a[i][j+4]=a[i][j];
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
    for(i=0;i<4;i++)
    {
        k[i]=Max(a[i]);
    }
    int  q=4;
    for(i=0;i<3;i++)
    {
        int    t=0;
        for(int j=0;j<8;j++)
        {
            
            h[t]=a[i][j]+a[i+1][j];
            t++;
        }
        k[q]=Max(h);
        q++;
    }
    for(i=0;i<2;i++)
    {
        int    t=0;
        for(int j=0;j<8;j++)
        {
            
            h[t]=a[i][j]+a[i+1][j]+a[i+2][j];
            t++;
        }
        k[q]=Max(h);
        q++;
    }
    int t=0;
    i=0;
    for(int j=0;j<8;j++)
    {
        
        h[t]=a[i][j]+a[i+1][j]+a[i+2][j]+a[i+3][j];
        t++;
    }
    k[q]=Max(h);
    q++;
    cout<<endl;
    int max=k[0];
    for(i=0;i<q;i++)
    {
        if(k[i]>max)
            max=k[i];
    }
    cout<<"最大子矩阵的值为:"<<endl;
    cout<<max;
    return 0;
}

4.运行结果。

5.体会。

  有了思路,进行编程时就方便多了,即使有些方面不好实现,但是大家一起思考,还是能解决的。

6.照片。

原文地址:https://www.cnblogs.com/nulidexuezha/p/4391064.html