时间限制: 1000 ms 内存限制: 65536 KB
提交数: 5521 通过数: 2963

题目描述
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 × 1)子矩阵。

比如,如下4 × 4的矩阵

0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
的最大子矩阵是

9 2
-4 1
-1 8
这个子矩阵的大小是15。

输入
输入是一个N×N的矩阵。输入的第一行给出N(0<N≤100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[−127,127]。

输出
输出最大子矩阵的大小。

输入样例
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2

输出样例
15

代码

#include <iostream>
#include <cstring>
#define N 128
using namespace std;

int matN;

int totN; //  从 x 列 第 y 行 上下相加的和 

int ret[N]; 

int f[N]; 

int n;

inline int maxline(int *line)
{
    int maxn=-999999999;
    for(int i=1;i<=n;i++)
    {
        //      如果是正数       则跟着                否则自立门户     贪心算法   
        f[i]= ( f[i-1] > 0 ) ? ( f[i-1] + line [i] ) : line[i];
        maxn=max(maxn,f[i]);
    }
    return maxn;
} 

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>mati;
            
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            toti=toti+mati;
    
    int maxn=-999999999; 
    
    //定行 
    for(int i=1;i<=n;i++)
        for(int j=i;j<=n;j++)
        {
            //将每一列的结果计算出来 
             
             for(int k=1;k<=n;k++)
                ret[k]=totk-totk; 
            maxn=max(maxn,maxline(ret));
        }
    cout<<maxn;
}

Last modification:February 19th, 2021 at 09:39 pm