1224:最大子矩阵
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 10362 通过数: 5874
【题目描述】
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1×1)子矩阵。
比如,如下4×4的矩阵
09−4−1−2218−7−6−40021−20−2−7
的最大子矩阵是
9−4−121892−41−18
这个子矩阵的大小是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
//我用的枚举的方法,没想到也过了,哈哈。代码不是很长呢,不到30行噢 #include<bits/stdc++.h>//Writed by Wangzhimin Date:2022.05.07 using namespace std;//没想到会过,计算太重复了,担心超时哈 int n,maxn=-128; int a[105][105],b[105][105];//a中存原来的数据,b中是运算的数据 int main(){ int i,j; scanf("%d",&n); for(int x=0;x<n;x++)//输入数据到a中 for(int y=0;y<n;y++) scanf("%d",&a[x][y]); int x,y; for(y=0;y<n;y++)//列的变化 for(x=0;x<n;x++){//行的变化 for(int t=x;t<n;t++)//把a中的数据复制到b中 for(int c=y;c<n;c++) b[t][c]=a[t][c]; for(i=x;i<n;i++)//从第一行开始 for(j=y+1;j<n;j++) b[i][j]+=b[i][j-1]; for(i=x+1;i<n;i++)//从第一列开始加 for(j=y;j<n;j++) b[i][j]+=b[i-1][j]; for(i=x;i<n;i++)//计算b中的最大值 for(j=y;j<n;j++) maxn=max(maxn,b[i][j]); } printf("%d\n",maxn);// 输出 }