读入以后想枚举j,用个maxv[i][j]数组表示在第i行,从第j个开始n个的最大值。
后来再枚举i,记录最大值。
最小值同理。
复杂度O(abn)。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 1000; const int INF = 0x3f3f3f3f; int n,m,k,ans = INF; int map[maxn][maxn],minv[maxn][maxn],maxv[maxn][maxn]; int main() { scanf("%d%d%d",&n,&m,&k); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) scanf("%d",&map[i][j]); for(int i = 1; i <= n; i++) for(int j = 1; j <= m-k+1; j++) { int maxa = -INF,mina = INF; for(int l = j; l < j + k; l++) { if(map[i][l] > maxa) maxa = map[i][l]; if(map[i][l] < mina) mina = map[i][l]; } maxv[i][j] = maxa; minv[i][j] = mina; } for(int j = 1; j <= m-k+1; j++) { for(int i = 1; i <= n-k+1; i++) { int maxa = -INF,mina = INF; for(int l = i; l < i + k; l++) { maxa = max(maxa,maxv[l][j]); mina = min(mina,minv[l][j]); } ans = min(ans,maxa-mina); } } printf("%d ",ans); return 0; }