求全1的最大正方形的边长 和 全1的最大子矩阵的面积 和POJ 2559 最大直方图
2017-03-18 17:18
447 查看
求全1的最大正方形的边长
全1的最大子矩阵的面积
在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多。
输入:
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行是两个整数m、n(1<=m、n<=1000):代表将要输入的矩阵的大小。
矩阵共有m行,每行有n个整数,分别是0或1,相邻两数之间严格用一个空格隔开。
输出:
对应每个测试案例,输出矩阵中面积最大的全1子矩阵的元素个数。
样例输入:
样例输出:
解题思路:
从第一行开始,一行一行向下扫描,记录每一列当前的1的个数(碰到0时候清零,可以理解为高度,记录其为h[i ]),然后计算每一列的符合该列高度的矩形有多宽(对第j列而言,宽度为r[j]-l[j]+1)最后遍历完所有行得到的最大面积就是答案。
AC代码:
#include <iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<map> #include<queue> #define ll long long #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; int dir[4][2]= {{0,1},{1,0},{-1,0},{0,-1}}; int mapp[1009][1009],dp[1009][1009]; int main() { int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); mem(mapp,0); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { scanf("%d",&mapp[i][j]); } } int flag=0,maxx; maxx=0; mem(dp,0); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(mapp[i][j]==1) { flag=1; int x=i,y=j;int sum=0; if(mapp[i][j-1]==1&&mapp[i-1][j]==1&&mapp[i-1][j-1]==1) { dp[i][j]=min(min(dp[i-1][j-1],dp[i-1][j]),dp[i][j-1])+1; } } maxx=max(maxx,dp[i][j]); } } if(flag==1) printf("%d\n",maxx+1); else printf("0\n"); } }
全1的最大子矩阵的面积
面积最大的全1矩阵
题目描述:在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多。
输入:
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行是两个整数m、n(1<=m、n<=1000):代表将要输入的矩阵的大小。
矩阵共有m行,每行有n个整数,分别是0或1,相邻两数之间严格用一个空格隔开。
输出:
对应每个测试案例,输出矩阵中面积最大的全1子矩阵的元素个数。
样例输入:
2 2 0 0 0 0 4 4 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0
样例输出:
0 4
解题思路:
从第一行开始,一行一行向下扫描,记录每一列当前的1的个数(碰到0时候清零,可以理解为高度,记录其为h[i ]),然后计算每一列的符合该列高度的矩形有多宽(对第j列而言,宽度为r[j]-l[j]+1)最后遍历完所有行得到的最大面积就是答案。
AC代码:
#include<cstdio> #include<cstring> using namespace std; int matrix[1005][1005]; int h[1005]; int r[1005]; int l[1005]; int main(int argc,char *argv[]) { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { int i,j,k; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&matrix[i][j]); } } memset(h,0,sizeof(h)); int ans=0; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(matrix[i][j]==1) h[j]++; else h[j]=0; } h[0]=h[m+1]=-1; for(j=1;j<=m;j++)//l[i]表示h[i]左边最远的一个h值不小于h[i]的位置 { //即l[i]到i的所有h值均>=h[i],r[i]同理 k=j; while(h[j]<=h[k-1]) k=l[k-1]; l[j]=k; } for(j=m;j>=1;j--)//r[i]表示h[i]右边最远的一个h值不小于h[i]的位置 { k=j; while(h[j]<=h[k+1]) k=r[k+1]; r[j]=k; } for(j=1;j<=m;j++) { if(ans<h[j]*(r[j]-l[j]+1)) ans=h[j]*(r[j]-l[j]+1); } } printf("%d\n",ans); } return 0; }
相关文章推荐
- 华为机考 给你一个N*M的矩阵,每个位置的值是0或1,求一个面积最大的子矩阵,这个矩阵必须是一个正方形,且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;
- Poj 2559 最大矩形面积
- 单调栈:柱形统计图中最大面积(POJ 2559)
- POJ 2559 Largest Rectangle in a Histogram(单调栈维护最大矩形面积)
- Poj 2559 最大矩形面积
- poj 2559 Largest Rectangle in a Histogram 求面积最大的矩形(单调栈)
- Poj 2559 Largest Rectangle in a Histogram(柱形统计图中的最大矩形面积)
- Poj 2559 最大矩形面积 v单调栈 分类: Brush Mode 2014-11-13 20:48 81人阅读 评论(0) 收藏
- poj 2559 求连续的最大矩形面积(也可用于ccf最大连续矩形面积)
- Poj 2559 最大矩形面积 v单调栈
- 连续区域最大矩形面积 POJ 1964 2082 2559 2796 3250 3494
- POJ 2559最大矩形面积
- 单调栈:柱形统计图中最大面积(POJ 2559)
- POJ 2559 题解 最大矩形面积 单调栈
- poj2559(单调栈)最大矩形面积
- poj 2559 dp(柱状图的最大面积)
- POJ 2559 最大矩形面积 poj 3494
- 连续最大区域面积系列 POJ 2082,2559,2796,3494,1964,3250
- POJ 2079 Triangle(凸包_旋转卡壳之最大三角形面积)
- POJ--1050--To the Max(线性动规,最大子矩阵和)