• #DP# ----- OpenJudge最大子矩阵


    OpenJudge 1768:最大子矩阵

    总时间限制: 1000ms   内存限制: 65536kB
    描述
    已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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

    矩阵 内数字求和最大,不必为了求和最大不择手段画出奇奇怪怪的图形。
    可考虑将矩阵降维变成区间求和最大。

     1 #include<stdio.h>
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 int a[200][200],b[20101][200],c[100],t,n,m,maxx=-10000;
     6 
     7 int f(int x){
     8     int ans=-39355861,sum=0,i;
     9     for(i=1;i<=n;i++){
    10        sum+=b[x][i];
    11        ans=max(ans,sum);
    12        if(sum<0) sum=0;
    13     }
    14     return ans;
    15 }
    16 int main(){
    17     int i,j,k;
    18     scanf("%d",&n);
    19     for(i=1;i<=n;i++)
    20        for(j=1;j<=n;j++){//降维 横行内++ 
    21              scanf("%d",&a[i][j]);
    22           a[i][j]+=a[i-1][j];
    23        }
    24     for(i=1;i<=n;i++)
    25        for(j=0;j<i;j++){//矩阵的长度 
    26              t++;//计算所有矩阵个数 
    27              for(k=1;k<=n;k++)//矩阵的宽度 
    28              b[t][k]=a[i][k]-a[j][k];//第t个矩阵宽度为k 和为 a[i][k]-a[j][k]
    29        }
    30     for(i=0;i<t;i++)
    31        maxx=max(maxx,f(i));//选出和最大矩阵 
    32     printf("%d",maxx);
    33     return 0;
    34 }


  • 相关阅读:
    python 函数2
    数据结构----栈
    python 函数
    数据结构----队列
    python 数据类型_字典和集合
    python 数据类型_数组和元组
    python 数据类型_整数_浮点数
    数据结构----链表
    laravel5.5 自带的忘记密码邮箱找回功能小记
    laravel5.5使用sendCloud邮件服务
  • 原文地址:https://www.cnblogs.com/wjting/p/6007402.html
Copyright © 2020-2023  润新知