COJN 0483 800501求最大非空子矩阵

800501求最大非空子矩阵
难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述

已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(' ')
 8 #define ENT putchar('
')
 9 using namespace std;
10 const int maxn=100+10;
11 int n,a[maxn][maxn],dp[maxn];
12 int get(int a[],int n){
13     int mx=a[0],tmp=0;
14     for (int i=0;i<n;i++){
15         if(tmp>0)tmp+=a[i];else tmp=a[i];mx=max(mx,tmp);
16     }return mx;
17 }
18 inline int read(){
19     int x=0,sig=1;char ch=getchar();
20     for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0;
21     for(;isdigit(ch);ch=getchar())x=10*x+ch-'0';
22     return sig?x:-x;
23 }
24 inline void write(int x){
25     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
26     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
27     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
28 }
29 void init(){
30     n=read();
31     for(int i=0;i<n;i++)
32         for(int j=0;j<n;j++)
33             a[i][j]=read();
34     int res=a[0][0];
35     for(int i=0;i<n;i++){
36         memset(dp,0,sizeof(dp));
37         for(int j=i;j<n;j++){
38             for(int k=0;k<n;k++)dp[k]+=a[j][k];
39             res=max(res,get(dp,n));
40         }
41     }
42     write(res);
43     return;
44 }
45 void work(){
46     return;
47 }
48 void print(){
49     return;
50 }
51 int main(){init();work();print();return 0;}
原文地址:https://www.cnblogs.com/chxer/p/4675250.html