挑战程序设计竞赛(算法和数据结构)——17.5最大长方形的JAVA实现

Posted 小乖乖的臭坏坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——17.5最大长方形的JAVA实现相关的知识,希望对你有一定的参考价值。

题目&思路:


代码:

import java.util.Scanner;
import java.util.Stack;

public class LargestRectangle 
    static class Rectangle//定义一个矩形类
        public int pos, height;
        Rectangle()
        Rectangle(int pos, int height)
            this.pos = pos;
            this.height = height;
        
    

    public static void main(String[] args) 
        Scanner cin = new Scanner(System.in);
        int H = cin.nextInt();
        int W = cin.nextInt();
        int buffer[][] = new int[H][W];
        int T[][] = new int[H][W];
        for (int i=0;i<H;i++)
            for (int j=0;j<W;j++)
                buffer[i][j] = cin.nextInt();
                if (buffer[i][j]==1)T[i][j] = 0;
                else if(i==0)T[i][j] = 1;
                else T[i][j] = T[i-1][j] + 1;
            
        

        int square[][] = new int[H][W];
        int max_square = 0;
        for (int i=0;i<H;i++)
            for (int j=0;j<W;j++)
                //对每一个位置计算最大面积
                int temp = 0;
                Stack<Rectangle> rect = new Stack<>();
                for (int k=j;k>=0;k--)
                    if (k==j)
                        Rectangle r = new Rectangle(k, T[i][k]);
                        rect.add(r);
                    
                    else
                        if (rect.peek().height<T[i][k])
                            rect.peek().pos = k;
                        else 
                            Rectangle r = new Rectangle(k, T[i][k]);
                            rect.add(r);
                        
                    
                
                while (!rect.isEmpty())
                    if(temp<rect.peek().height*(j-rect.peek().pos+1))
                        temp = rect.peek().height*(j-rect.peek().pos+1);
                    
                    rect.pop();
                
                square[i][j] = temp;
                if(max_square<square[i][j])
                    max_square = square[i][j];
                
            
        
        System.out.println(max_square);
    



输入1:

4 5
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0
0 0 0 1 0

输出1:

6

输入2:

8 8
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
1 0 0 0 1 1 0 0
0 0 0 0 0 0 0 1

输出2:

12

输入3:

7 10
1 0 0 0 0 0 0 0 1 0
0 0 1 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 1 0 0

输出3:

20

以上是关于挑战程序设计竞赛(算法和数据结构)——17.5最大长方形的JAVA实现的主要内容,如果未能解决你的问题,请参考以下文章

挑战程序设计竞赛(算法和数据结构)——10.3最大堆(最小堆)的JAVA实现

挑战程序设计竞赛(算法和数据结构)——15.5最小生成树(Kruskal算法)的JAVA实现

挑战程序设计竞赛(算法和数据结构)——分割(下)&快速排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现

挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现

挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现