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

原创 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));

	}

}




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

求二维数组矩形区域最大和问题

求二维数组矩形区域最大和问题 对于一个二维数组

【dp】最大全0子矩阵

动规经典问题,给你一个全由01组成的矩阵,找出最大的全是0的子矩阵的面积...

动态规划练习-2(最大子矩阵)

已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。比如,如下4 * 4的矩阵0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0...
  • snayf
  • snayf
  • 2017年04月16日 16:58
  • 158

C++ 经典知识点面试题

1、指针的优点和缺点 优点:灵活高效 (1)提高程序的编译效率和执行速度(数组下标往下移时,需要使用乘法和加法,而指针直接使用++即可) (2)通过指针可使用主调函数和被调函数之间共享变量或数据...

输出数组中所有三个数相加为0的解

给定一个数组,有正有负,列出其中三个数和为零的组合 public class FindThree { public static void main(String[] args) { in...
  • Hero_R
  • Hero_R
  • 2016年10月29日 23:10
  • 1220

hdu1176 免费馅饼 动态规划 二维数组实现

免费馅饼 Time Limit: 1000MS Memory Limit: 32768KB Submit Statistic Discuss Problem Description ...

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

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
  • 352

最大子段-n上找m个子段的和为最大-动态规划-二维dp+滚动数组dp优化

1.二维dp dp[i][j]代表的是j长度上找到i段,使得i段和最大。(其中最后一段的最后一位一定要是a[j],这句话不理解的可以看看http://blog.csdn.net/qq_36523667...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二维数组最大面积的问题(动态规划)
举报原因:
原因补充:

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