zoukankan      html  css  js  c++  java
  • #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 }


  • 相关阅读:
    基于Metaweblog API 接口一键发布到国内外主流博客平台
    uva144 Student Grants
    Uva 10452
    Uva 439 Knight Moves
    Uva 352 The Seasonal War
    switch语句
    java——基础知识
    我的lua学习2
    codeforces 431 D. Random Task 组合数学
    codeforces 285 D. Permutation Sum 状压 dfs打表
  • 原文地址:https://www.cnblogs.com/wjting/p/6007402.html
Copyright © 2011-2022 走看看