bzoj1047: [HAOI2007]理想的正方形

读入以后想枚举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\n",ans);
    return 0;
}
posted @ 2016-04-11 21:47  invoid  阅读(148)  评论(0编辑  收藏  举报