返回一个二维整数数组中最大子数组的和

一思路

假设f(i,j)表示以第i行开始,到第j行结束的矩阵中子矩阵的最大和

为了求f(i,j),我们对这个矩阵(第i行开始,到第j行结束的矩阵)进行处理:

把这个矩阵中的每一列数相加,最后形成一个一维数组,其长度等于原二维数组列的个数。

在该一维数组上,求解最大子数组和。

二代码

#include<iostream>
using namespace std;

int MAX(int s[],int n)
{
    int i,sum=0,max=s[0];
    for(i=0;i<n;i++)
    {
        if(sum>0)
        {
            sum=sum+s[i];
        }
        else
        {
            sum=s[i];
        }
        if(sum>max)
        {
            max=sum;
        }
    }
    return max;
}

int MIN(int s[],int n)
{
    int i,sum=0,min=s[0];
    for(i=1;i<n;i++)
    {
        if(sum<0)
        {
            sum=sum+s[i];
        }
        else
        {
            sum=s[i];
        }
        if(sum<min)
        {
            min=sum;
        }
    }
    return min;
}

int SUM(int s[],int n)
{
    int i,sum=0;
    for(i=0;i<n;i++)
    {
        sum=sum+s[i];
    }
    return sum;
}

void main()
{
    int m,n,i,j,a[100][100];
    cout<<"请输入矩阵的行数和列数:";
    cin>>m>>n;
    cout<<"请输入矩阵元素"<<endl;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            cin>>a[i][j];
        }
    }
    int sum,max,s[100],k=0,min,p=a[0][0];
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            s[j]=0;
        }
        while(k+i<m)
        {
            for(j=0;j<n;j++)
            {
                s[j]=s[j]+a[k+i][j];
            }
            sum=SUM(s,n);
            min=MIN(s,n);
            max=MAX(s,n);
            if(sum-min>max)
            {
                max=sum-min;
            }
            if(max>p)
            {
                p=max;
            }
            k++;
        }
        k=0;
    }
    if(m==1&&n==1) p=a[0][0];
    cout<<"子矩阵最大值为"<<p<<endl;
}

三伙伴

鲁建伟

四总结
对如何查找二维整数数组最大子数组的和有了深刻的理解,对循环函数的使用也更加熟悉,但是还有许多不足,以后需要努力学习,多多练习。

原文地址:https://www.cnblogs.com/wushao12345/p/9825813.html