我用的枚举的方法,没想到也过了,哈哈。代码不是很长呢,不到30行噢
1282:最大子矩阵
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 8614 通过数: 4286
【题目描述】
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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×NN×N的矩阵。输入的第一行给出N(0<N≤100)N(0<N≤100)。再后面的若干行中,依次(首先从左到右给出第一行的NN个整数,再从左到右给出第二行的NN个整数……)给出矩阵中的N2N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[−127,127][−127,127]。
【输出】
输出最大子矩阵的大小。
【输入样例】
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
【输出样例】
15
【1282】程序运行结果
用户名:wangzhimin,题目编号:1282,运行编号:16094038,代码长度:853Bytes
通过
测试点 | 结果 | 内存 | 时间 |
测试点1 | 答案正确 | 608KB | 1MS |
测试点2 | 答案正确 | 628KB | 2MS |
测试点3 | 答案正确 | 604KB | 1MS |
测试点4 | 答案正确 | 640KB | 4MS |
测试点5 | 答案正确 | 688KB | 94MS |
测试点6 | 答案正确 | 684KB | 45MS |
测试点7 | 答案正确 | 676KB | 35MS |
测试点8 | 答案正确 | 700KB | 102MS |
测试点9 | 答案正确 | 684KB | 102MS |
测试点10 | 答案正确 | 688KB | 102MS |
#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);// 输出
}