800501求最大非空子矩阵 |
难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B |
试题描述 |
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。 0 -2 -7 0 的最大子矩阵是 9 2 这个子矩阵的大小是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(‘\n‘) 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;}
时间: 2024-10-18 18:58:24