1051 最大子矩陣和 基準時間限制:2 秒 空間限制:131072 KB 分值: 40 難度:4級演算法題 收藏 關註 1051 最大子矩陣和 基準時間限制:2 秒 空間限制:131072 KB 分值: 40 難度:4級演算法題 1051 最大子矩陣和 基準時間限制:2 秒 空間限制:131072 K ...
1051 最大子矩陣和 基準時間限制:2 秒 空間限制:131072 KB 分值: 40 難度:4級演算法題 收藏 關註 一個M*N的矩陣,找到此矩陣的一個子矩陣,並且這個子矩陣的元素的和是最大的,輸出這個最大的值。 例如:3*3的矩陣: -1 3 -1 2 -1 3 -3 1 2 和最大的子矩陣是: 3 -1 -1 3 1 2 Input
第1行:M和N,中間用空格隔開(2 <= M,N <= 500)。 第2 - N + 1行:矩陣中的元素,每行M個數,中間用空格隔開。(-10^9 <= M[i] <= 10^9)Output
輸出和的最大值。如果所有數都是負數,就輸出0。Input示例
3 3 -1 3 -1 2 -1 3 -3 1 2Output示例
7
複習了一下n^3最大子矩陣的寫法
註意在寫首碼和的時候別忘了左端點的坐標是i-1不是i
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #define LL long long 6 using namespace std; 7 const LL MAXN=2001; 8 inline LL read() 9 { 10 char c=getchar();LL flag=1,x=0; 11 while(c<'0'||c>'9') {if(c=='-') flag=-1;c=getchar();} 12 while(c>='0'&&c<='9') x=(x*10+c-48),c=getchar(); return x*flag; 13 } 14 LL n,m; 15 LL a[MAXN][MAXN]; 16 LL sum[MAXN][MAXN]; 17 int main() 18 { 19 memset(sum,0,sizeof(sum)); 20 m=read(),n=read(); 21 for(LL i=1;i<=n;i++) 22 for(LL j=1;j<=m;j++) 23 a[i][j]=read(),sum[i][j]=sum[i-1][j]+a[i][j]; 24 LL ans=0; 25 for(LL i=1;i<=n;i++) 26 for(LL j=i;j<=n;j++) 27 { 28 LL now=0; 29 for(LL k=1;k<=m;k++) 30 { 31 now=now+sum[j][k]-sum[i-1][k], 32 now=max(now,(long long )0), 33 ans=max(ans,now); 34 } 35 36 } 37 printf("%lld",ans); 38 return 0; 39 }