最近也写了些许题目吧,还是写写博客,捋捋思路。
求一个$a \times b(a,b \leq 10^3)$的矩阵,求出一个$n \times n (n \leq 100)$的矩阵,设矩阵中元素最小值$Min$,最大值$Max$,
最小化$Max - Min$
Sol : 这个题事实上只需要暴力扫每个子矩阵即可。复杂度是$O(abn)$
预处理对点$(i,j)$的$ Max[i][j] = \max\limits_{k=i-n+1}^{i} a[k][j]$
枚举每个子矩阵的时候,求$(i,j)$为左下角的$n \times n$子矩阵的
$MAX=\max\limits_{k=j-n+1}^{j} Max[i][k]$而$MIN$的处理同理。
// luogu-judger-enable-o2 # include<bits/stdc++.h> # define int long long using namespace std; const int N=1e3+10; int w[N][N]; int Max[N][N],Min[N][N]; int a,b,n,ans=0x3f3f3f3f; signed main() { scanf("%lld%lld%lld",&a,&b,&n); for (int i=1;i<=a;i++) for (int j=1;j<=b;j++) scanf("%lld",&w[i][j]); memset(Max,-0x3f,sizeof(Max)); memset(Min,0x3f,sizeof(Min)); for (int i=1;i<=a;i++) for (int j=1;j<=b;j++) { if (j<n) continue; for (int k=j;k>=j-n+1;k--) Min[i][j]=min(Min[i][j],w[i][k]), Max[i][j]=max(Max[i][j],w[i][k]); } for (int i=1;i<=a;i++) for (int j=1;j<=b;j++) { int mi=0x3f3f3f3f,ma=-0x3f3f3f3f; if (i<n) continue; for (int k=i;k>=i-n+1;k--) mi=min(mi,Min[k][j]),ma=max(ma,Max[k][j]); if (ma-mi<ans&&ma-mi>=0) ans=ma-mi; } printf("%lld\n",ans); return 0; }