求01矩阵中的最大的正方形面积
2013-06-12 19:07
399 查看
先上题目
输入一个n表示有一个n*n的矩阵,然后输入矩阵的内容,"H"代表0,"."代表1,求出最大的填满1的正方形的面积。
这是一道dp。
定义一个数组s[][]代表以(1,1)和(i,j)为对角线的矩形中全为1的的矩形的边长。
再定义一个数组row[][]代表(i,0)-(i,j)连续的1最长的长度;
再定义一个数组col[][]代表(0,j)-(i,j)连续的1最长的长度;
则
if((i,j)==0) row[i][j]=col[i][j]=0;
else
{
row[i][j]=row[i][j-1]+1;
col[i][j]=col[i-1][j]+1;
}
对于s[i][j],就会是s[i-1][j-1]+(i,j) ,row[i][j] ,col[i][j] 中的最小值,因为需要限制图形是正方形。
最后只要扫一下s[][],找出里面最大的值,就是所求的正方形的边长,再平方就是所求的面积大小。
目测有更加好的方法,这种方法在OJ上跑了一下要65ms。= =
上代码
输入一个n表示有一个n*n的矩阵,然后输入矩阵的内容,"H"代表0,"."代表1,求出最大的填满1的正方形的面积。
这是一道dp。
定义一个数组s[][]代表以(1,1)和(i,j)为对角线的矩形中全为1的的矩形的边长。
再定义一个数组row[][]代表(i,0)-(i,j)连续的1最长的长度;
再定义一个数组col[][]代表(0,j)-(i,j)连续的1最长的长度;
则
if((i,j)==0) row[i][j]=col[i][j]=0;
else
{
row[i][j]=row[i][j-1]+1;
col[i][j]=col[i-1][j]+1;
}
对于s[i][j],就会是s[i-1][j-1]+(i,j) ,row[i][j] ,col[i][j] 中的最小值,因为需要限制图形是正方形。
最后只要扫一下s[][],找出里面最大的值,就是所求的正方形的边长,再平方就是所求的面积大小。
目测有更加好的方法,这种方法在OJ上跑了一下要65ms。= =
上代码
#include <stdio.h> #include <string.h> #define MAX 1100 #define max(x,y) (x>y ? x: y) using namespace std; int s[MAX][MAX],col[MAX][MAX],row[MAX][MAX]; char ch[MAX][MAX]; int min(int x,int y,int z) { if(x<=y && x<=z) return x; else if(y<=x && y<=z) return y; return z; } int main() { int i,j,t,n,maxn; char o; scanf("%d",&n); o=getchar(); memset(s,0,sizeof(s)); memset(ch,0,sizeof(ch)); memset(col,0,sizeof(col)); memset(row,0,sizeof(row)); for(i=0;i<n;i++) { gets(ch[i]); } for(t=0;t<n;t++) { i=t+1; j=0; while(ch[t][j]!='\0') { if(ch[t][j]=='H') { j++; s[i][j]=0; } else { j++; s[i][j]=1; row[i][j]=row[i][j-1]+1; col[i][j]=col[i-1][j]+1; } } } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { s[i][j]=min(s[i-1][j-1]+1,col[i][j],row[i][j]); } } maxn=0; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { //printf("%d ",s[i][j]); maxn=max(maxn,s[i][j]); } //printf("\n"); } printf("%d\n",maxn*maxn); return 0; }
相关文章推荐
- CodeForces 22B Bargaining Table 01矩阵求最大矩形面积
- LeetCode: 221_Maximal Square | 二维0-1矩阵中计算包含1的最大正方形的面积 | Medium
- 华为机考 给你一个N*M的矩阵,每个位置的值是0或1,求一个面积最大的子矩阵,这个矩阵必须是一个正方形,且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;
- 84. Largest Rectangle in Histogram *HARD* -- 柱状图求最大面积 85. Maximal Rectangle *HARD* -- 求01矩阵中的最大矩形
- [LeetCode] 01矩阵中最大正方形 Maximal Square
- 01矩阵最大正方形
- 寻找01矩阵中的最大子矩阵--华为OJ机试--java语言版
- 找短板1:柱状图中的最大矩阵面积
- Codeforce 375B 给定5000的布尔矩阵 求最大面积的全1子矩阵
- 动态规划4:最大子段和问题到最大子矩阵问题(四):最大子矩阵面积问题
- 一个M*N的矩阵,元素取值1或0,问如何找到最大的正方形,其所有的元素都为1
- 01二维矩阵中最大全为1的正方形maxSquare
- 【DP求最大子矩阵面积】hdu 1506
- 0 1 矩阵查找最大正方形
- 暑期dp46道(9)——HDU 1505City Game 求最大子矩阵面积
- URAL 1097. Square Country 2 (离散化,最大正方形面积)
- 矩阵动归--最大正方形
- vojos 1055,1057 最大子矩阵、正方形
- 九度OJ 1497 面积最大的全1子矩阵 -- 动态规划
- 题目1497:面积最大的全1子矩阵