zoukankan      html  css  js  c++  java
  • UVa 836

    题目:给你一个n*n的01矩阵,求里面最大的1组成的矩形的米娜及。

    分析:dp。单调队列。UVa 1330同题,仅仅是输入格式变了。

                我们将问题分解成最大矩形。即求解以k行为底边的图形中的最大矩形。然后合并。求最大的矩形。
              
                预处理: 求出以每行为底边的每一列从底边開始向上的最大连续1的高度MaxH。

    O(N^2) ;

                dp:对于每一层底边。我们利用单调队列求解出本行的最大矩形。 O(N)。

                关于单调队列的求解分析,可參照zoj1985的题解;

                整体时间:T(N) = O(N^2)+O(N)*O(N) = O(N^2)。

    说明:注意数据读入格式。

    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    
    char maps[30][30];
    char Maps[30][30];  
    int  MaxH[30][30];  
    int  L[30],R[30];  
    int  MUQ[30];  
      
    
    int main()
    {
    	int T;
    	scanf("%d",&T);getchar();
    	for (int t = 1 ; t <= T ; ++ t) {
    		scanf("%s",maps[0]);
    		int n = strlen(maps[0]);
    		for (int i = 1 ; i < n ; ++ i)
    			scanf("%s",maps[i]);
    		for (int i = 1 ; i <= n ; ++ i)
    		for (int j = 1 ; j <= n ; ++ j)
    			Maps[i][j] = maps[i-1][j-1];
    		
    		 //计算每条底边上的每列高度   
            memset(MaxH, 0, sizeof(MaxH));  
            for (int i = 1 ; i <= n ; ++ i)  
            for (int j = 1 ; j <= n ; ++ j)  
                if ( Maps[i][j] == '1' )  
                    MaxH[i][j] = MaxH[i-1][j]+1;  
                else   
                    MaxH[i][j] = 0;  
                  
            for (int i = 1 ; i <= n ; ++ i)  
                MaxH[i][0] = MaxH[i][n+1] = -1;  
      
            int MaxV = 0;  
            for (int i = 1 ; i <= n ; ++ 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
    ",MaxV);
    		if (t < T) printf("
    "); 
    	}
    	
    	return 0;
    }
    


  • 相关阅读:
    第06组 Alpha冲刺(4/6)
    第06组 Alpha冲刺(3/6)
    第06组 Alpha冲刺(2/6)
    第06组 Alpha冲刺(1/6)
    第06组 团队Git现场编程实战
    团队项目-需求分析报告
    团队项目-选题报告
    洛谷3195 玩具装箱(dp,斜率优化)
    CF 1334(edu85) F. Strange Function(线段树,dp)
    CF1325E. Ehab's REAL Number Theory Problem(最小环)
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5232037.html
Copyright © 2011-2022 走看看