题目描述
给定一个 n ∗ m 的矩阵 A,对其进行 q 次询问:以 (x1, y1) 为左上角,(x2, y2) 为右下角的子矩
阵中,所有元素的最大值。
输入
第一行包含三个整数 n,m 和 q。
之后 n 行每行包含 m 个整数 Ai,j。
之后 q 行每行包含四个整数 x1,y1,x2 和 y2。
输出
共 q 行包含一个整数 ans,表示子矩阵中所有元素的最大值。
输入样例
3 3 2
1 2 3
1 2 3
2 3 1
1 1 2 2
2 2 3 3
输出样例
2
3
说明
对于 100% 的数据:n, m, q ≤ 100
思路
暴力
稍稍优化了一下
#include<Algorithm>
#include<Iostream>
#include<Cstring>
#include<Cstdio>
#include<Cmath>
using namespace std;
int F[125][125],A[125][125];
int Max,xx,xy,yx,yy,n,m,k,t;
bool Bol;
int main()
{
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
scanf("%d",&A[i][j]);
F[i][j]=max(max(F[i-1][j],F[i][j-1]),A[i][j]);//求i,j前的最大数
}
while(t--)
{
scanf("%d%d%d%d",&xx,&xy,&yx,&yy);
Max=-1e9,Bol=0;
for(int i=yx;i>=xx;--i)
{
for(int j=yy;j>=xy;--j)
{
Max=max(A[i][j],Max);
if(Max==F[yx][yy])//如果是最大的直接退出
{
Bol=1;
break;
}
}
if(Bol)break;
}
printf("%d\n",Max);
}
return 0;
}