最大子矩阵(OJ 1768)

描述

已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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

多亏了Alinshans大佬才懂了这道题 --> 详细题解

 

代码^-^

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,mp[101][101],arr[101];

int bakmax(int arr[])
{
    int now=0,mx=0;
    for(int i=1;i<=n;++i) 
    {
        if(now>0) 
            now+=arr[i];
        else 
            now=arr[i];
        if(now>mx) mx=now;        
    }
    return mx;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            scanf("%d",&mp[i][j]);
    
    int ans=0;
    for(int i=1;i<=n;++i)
    {
        memset(arr,0,sizeof(arr));
        for(int j=i;j<=n;++j)
        {
            for(int k=1;k<=n;++k)
                arr[k]+=mp[j][k];
                
            int cur=bakmax(arr);
            if(cur>ans) ans=cur;
        }
    }
    printf("%d",ans);
    return 0;
} 

 

updated 2018-09-29

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,mp[101][101],arr[101];

int Get() //确定 l,r 
{
    int now=0,mx=0;
    for(int i=1;i<=n;++i) 
    {
        if(now>0) 
            now+=arr[i];
        else 
            now=arr[i];
        if(now>mx) mx=now;
    }
    return mx;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            scanf("%d",&mp[i][j]);
    
    int ans=0;
    for(int i=1;i<=n;++i) //第 i 行起 
    {
        memset(arr,0,sizeof(arr));
        for(int j=i;j<=n;++j) //往下叠加 
        {
            for(int k=1;k<=n;++k) //压缩成一维 
                arr[k]+=mp[j][k];
                
            int cur=Get();
            if(cur>ans) ans=cur; //确定 d 
        }
    }
    printf("%d",ans);
    return 0;
}

 

posted @ 2018-08-11 18:15  qseer  阅读(209)  评论(0编辑  收藏  举报