UVa 10074 - Take the Land

来源:互联网 发布:js中控制div隐藏 编辑:程序博客网 时间:2024/05/16 03:12

題目:給你一個二位的01矩陣,0的位置為空,在上面放一個最大面積的矩形,問面積是多少。

分析:dp,動態規劃。普通的三次方算法可以簡單計算。

            這裡給出一個O(N^2)的算法,使用單調隊列優化。

            把前i行的每一列都看做是一個細矩形高為從i層開始向上連續的0,寬為1;

            那麼我們的問題就轉化為,找到一層裡面的細矩形中可以畫出一個最大的矩形;

            在第i層的細矩形中畫出最大的矩形的時間複雜度為O(N),這裡用到單調隊列;

            以第j列的高度h(i,j)為高的矩形最大面積就是向兩邊延伸到高度小於他的邊界;

            這個邊界用兩個單調隊列先兩邊掃面就可以求出所有高度的兩個邊界;

            單調隊列存儲遞增的序列,遇到非遞減,所有他前面的高度大於他的都以她為右邊界;

            將這些數據都彈出來,繼續計算,集體參照代碼;

說明:最近忙於寫文檔,╮(╯▽╰)╭。

#include <stdio.h>#include <stdlib.h>#include <string.h>char Maps[101][101];int  MaxH[101][101];int  L[101],R[101];int  MUQ[101];int main(){    int t,m,n;    while (~scanf("%d%d",&m,&n) && n) {        for (int i = 1 ; i <= m ; ++ i)        for (int j = 1 ; j <= n ; ++ j)scanf("%d",&Maps[i][j]);        //计算每条底边上的每列高度         memset(MaxH, 0, sizeof(MaxH));        for (int i = 1 ; i <= m ; ++ i)        for (int j = 1 ; j <= n ; ++ j)            if (Maps[i][j] == 0)                MaxH[i][j] = MaxH[i-1][j]+1;            else                 MaxH[i][j] = 0;                    for (int i = 1 ; i <= m ; ++ i)            MaxH[i][0] = MaxH[i][n+1] = -1;        int MaxV = 0;        for (int i = 1 ; i <= m ; ++ i) {            //计算每个点的左边界             int tail = 0;            MUQ[0] = 0;            for (int j = 1 ; j <= n+1 ; ++ j) {                while (tail >= 0 && MaxH[i][MUQ[tail]] > MaxH[i][j])                    R[MUQ[tail --]] = j;                MUQ[++ tail] = j;                }            //计算每个点的右边界                 tail = 0;            MUQ[0] = n+1;            for (int j = n ; j >= 0 ; -- j) {                while (tail >= 0 && MaxH[i][MUQ[tail]] > MaxH[i][j])                    L[MUQ[tail --]] = j;                MUQ[++ tail] = j;                }            //求解            for (int j = 1 ; j <= n ; ++ j) {                int Temp = MaxH[i][j]*(R[j]-L[j]-1);                if (MaxV < Temp)                    MaxV = Temp;             }        }                printf("%d\n",MaxV);    }    return 0;}


0 0
原创粉丝点击