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
其他說明
資料範圍:題目描述中已經給出。
 

題解:然而以前用懸線法做過?(逃

寫了個最大子線段

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const int maxn=+;
int n,a[maxn][maxn],dp[maxn];
int get(int a[],int n){
int mx=a[],tmp=;
for (int i=;i<n;i++){
if(tmp>)tmp+=a[i];else tmp=a[i];mx=max(mx,tmp);
}return mx;
}
inline int read(){
int x=,sig=;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=;
for(;isdigit(ch);ch=getchar())x=*x+ch-'';
return sig?x:-x;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
void init(){
n=read();
for(int i=;i<n;i++)
for(int j=;j<n;j++)
a[i][j]=read();
int res=a[][];
for(int i=;i<n;i++){
memset(dp,,sizeof(dp));
for(int j=i;j<n;j++){
for(int k=;k<n;k++)dp[k]+=a[j][k];
res=max(res,get(dp,n));
}
}
write(res);
return;
}
void work(){
return;
}
void print(){
return;
}
int main(){init();work();print();return ;}