二维数组最大面积的问题(动态规划)

原创 2015年07月10日 17:42:06

今天遇到一个问题:

           给定一个二维数组,数组中的元素只有0和1,求面积最大的全1方阵的面积(就是矩阵内包含的全是1)。如图

红色的部分就为面积最大的方阵(方阵内元素都是1)。

我们可以新建一个矩阵,和原来的矩阵同样大小,但是这个矩阵内元素是存储着,以当前元素为方阵最右下角的元素的最大面积,像是上图中红色的那个方阵,右下角元素,就存着这个方阵的面积,但是这个元素的大小怎么求,是我接下来要讲的,新矩阵的元素是这么填充的,取这个元素的上方元素,左方元素,对角线元素,这几个元素都存着的是面积,如果将面积映射为01矩阵的话是不是应该有一个交集,如下图


现在要求以红色圆圈为有下角元素的最大方阵面积,那么此元素的左方元素的最大面积应该是深蓝色方框内的方阵的面积,上方最大面积应该是红色方框内的面积,对角元素的最大面积应该是浅蓝色方框内的面积,那么黑色方框内的方阵就是我们要求的最大面积,大家请看红色方框和看蓝色方框内的区域完全包含在黑色方框内,也就是说要求的方阵是不是比完全包含在黑框方阵内的区域(浅蓝色和红色方框),多一行一列啊,图画多了就会发现,要求的方阵的区域只会包含左,上,对角三个区域中最小的一个区域也就是,面积最小的区域,那么这个区域的边其实就是比要求区域的边短1,所以求出最小的面积,技能就去最小面积的边,那么就能求出要求的面积。那么新的矩阵每个元素就都可以算出来,所以最大面积应该就存储在这个新的矩阵内,所以从此矩阵取出最大元素就是,最大的面积。这就是运用了动态规划的思想。这道题很巧妙,需要想想,下面是我的代码,有兴趣的人可以看看,谢谢!!!

package com.test;

public class Main {

	public static int getMaxArea(char[][] area){
		if(area==null||area.length==0){
			return 0;
		}else{
			int max=0;
			int[][] maxArea=new int[area.length][area[0].length];
			if(area[0].length==0){
				return 0;
			}else{
				for(int i=0;i<area.length;i++){
					for(int j=0;j<area[i].length;j++){
						if(i==0||j==0){
							maxArea[i][j]=area[i][j]-'0';
							if(maxArea[i][j]>max){
								max=maxArea[i][j];
							}
						}else if(area[i][j]=='0'){
							maxArea[i][j]=0;
						}else{
							int length=Math.min(maxArea[i-1][j-1], Math.min(maxArea[i-1][j], maxArea[i][j-1]));
						    int nowArea=(int)Math.pow(Math.sqrt(length)+1, 2);
						    maxArea[i][j]=nowArea;
						    if(nowArea>max){
						    	max=nowArea;
						    }
						}
					}
				}
				return max;
			}
		}
	}
	
	public static void main(String[] args) {
		//char[][] test=new char[][]{"110".toCharArray(),"111".toCharArray(),"111".toCharArray()};
		char[][] test=new char[][]{"1".toCharArray()};
		System.out.println(getMaxArea(test));

	}

}




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

动态规划4:最大子段和问题到最大子矩阵问题(四):最大子矩阵面积问题

上文讲的是从二维矩阵(r*c),找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大 但是这个矩形的大小不一定是最大的,现在我们来找一个最大面积的子矩阵 转自:《浅谈用极大化思想解决最大子矩形问题》...

直方图中最大矩形面积

原文地址:http://www.geeksforgeeks.org/largest-rectangle-under-histogram/ 注意:本文并为对原文完整翻译,而是结合原文并根据本人理解写出...

[LeetCode] 01矩阵中最大正方形 Maximal Square

Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret...

面积最大的全1子矩阵

面积最大的全1矩阵 题目描述: 在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多。 输入: 输入可能包含多个测试样...

[LeetCode] 01矩阵中最大矩形 Maximal Rectangle

在一个M * N的矩阵中,所有的元素只有0和1, 找出只包含1的最大矩形。 例如:图中是一个4 × 6的矩形,画出红色的是我们要找到的区域。 仔细观察发现:因为我们要找的是矩形,所以它一...

[LeetCode] Find max subsquare whose border values are all 1

Imagine you have a square matrix, where each cell is filled with either black or white. Design an al...

【动态规划】求二维数组从左下到右上的最优路径

1.求二维数组从左下到右上的最优路径,使得路径和最大,并且只能向上或向下走。 解析:求最短路径,路径和最优等都可以用动态规划做。 dp[i][j]表示到i,j坐标的最优路径。 第一,确定初始条件...

LeetCode—Minimum Path Sum 二维数组最小路径,动态规划

感觉这是一系列的动态规划的算法,正好也将动态规划的算法进行一个总结: 算法一: 带权重的最小路径的问题 Given a m x n grid filled with non-negative...

hdu1248 寒冰王座 二维数组动态规划

寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi...
  • kyoma
  • kyoma
  • 2016-08-13 00:11
  • 306

在一个只包含0,1的二维数组中找到最大矩形的面积

1、用一个height数组表示从从上到下连续的1的高度。left,right表示当前矩形的边界。maxA = max(maxA,(right[j]-left[j])*height[j]); 例如: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)