• 最大子矩阵(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;
    }
    从0到1很难,但从1到100很容易
  • 相关阅读:
    Arrays工具类、二维数组
    Idea软件的使用
    循环语句
    方法
    objective-C 2.0
    Unix系统常用命令
    文献管理工具Zotero
    如何降低论文重复率
    SQL易忽视的细节
    数据库系统原理学习资源
  • 原文地址:https://www.cnblogs.com/qseer/p/9460595.html
Copyright © 2020-2023  润新知