二维图中找最大子矩形的四道题
来源:互联网 发布:用数据说话的广告语 编辑:程序博客网 时间:2024/05/11 02:22
hdu 1506 直方图中找最大矩形
找出每个矩形以自己的高能延伸到的左右边界
#include<stdio.h>#include<string.h>#define maxn 100010int n;__int64 max;struct node{ int left,right; __int64 num;}t[maxn];int main(){ int i,j,k,l; while(scanf("%d",&n)&&n!=0) { max=-1; for(i=0;i<n;i++) { scanf("%I64d",&t[i+1].num); t[i+1].left=t[i+1].right=i+1; } t[0].num=-1; t[n+1].num=-1; for(i=1;i<=n;i++) { while(t[i].num<=t[ t[i].left-1 ].num) t[i].left=t[ t[i].left -1 ].left; } for(i=n;i>=1;i--) { while(t[i].num<=t[ t[i].right+1 ].num) t[i].right=t[ t[i].right+1 ].right; } for(i=1;i<=n;i++) { __int64 tmp=(t[i].right-t[i].left+1)*t[i].num; if(tmp>max) max=tmp; } printf("%I64d\n",max); } return 0;}hdu 1505 二维图中找最大矩形
把每一行当做基线,同上题
#include<stdio.h>#include<string.h>#define maxn 1010char f[maxn][maxn];int s[maxn],max;struct node{int left,right,num;}num[maxn];int m,n;int main(){int i,j,k,l;scanf("%d",&l);while(l--){scanf("%d %d",&m,&n);for(i=0;i<m;i++){for(j=0;j<n;j++){scanf("%s",&f[i][j]); // %s过滤空格和回车}}max=0;for(i=0;i<m;i++){memset(num,-1,sizeof(num));memset(s,0,sizeof(s));for(j=1;j<=n;j++){for(k=i;k>=0;k--){if(f[k][j-1]=='F')s[j]++;elsebreak;}}for(j=0;j<=n+1;j++){num[j].left=j;num[j].right=j;num[j].num=s[j];}num[0].num=-1;num[n+1].num=-1;for(j=1;j<=n;j++){while(num[j].num<=num[ num[j].left-1 ].num )num[j].left=num[ num[j].left-1 ].left;}for(j=n;j>=1;j--){while(num[j].num<=num[ num[j].right+1].num )num[j].right=num[ num[j].right+1].right;}for(j=1;j<=n;j++){int tmp;tmp=(num[j].right-num[j].left+1)*num[j].num;if(tmp>max)max=tmp;}}printf("%d\n",max*3);}return 0;}hdu 2870 Largest Submatrix
分别把w,x,y,z全部转化成a,b,c,再求各个图的最大矩形,同上题,代码略
hdu 2830 Matrix Swapping II
图中的列可以任意交换,求由1组成的最大矩形,分别把每一行当做直方图的基线,dp[i]存第i列的高,在对它升序排序,即可求出最大的矩形
#include<stdio.h>#include<string.h>#include<stdlib.h>#define maxn 1015int n,m,max;char ma[maxn][maxn];int map[maxn][maxn];int dp[maxn];int cmp(const void*a,const void*b){ //return *(int*)a>*(int*)b?1:-1; return *(int*)a-*(int*)b;}int main(){ int i,j,k,l; while(~scanf("%d %d",&n,&m)&&n&&m) { for(i=0;i<n;i++) { scanf("%s",&ma[i]); } memset(map,0,sizeof(map)); for(i=0;i<n;i++) { for(j=0;j<m;j++) if(ma[i][j]=='1') map[i][j]=1; } max=-1; int tmp; for(i=0;i<n;i++) { memset(dp,0,sizeof(dp)); for(j=0;j<m;j++) { for(k=i;k>=0;k--) { if(map[k][j]==1) dp[j]++; else break; } } qsort(dp,m,sizeof(int),cmp); for(l=0;l<m;l++) { tmp=dp[l]*(m-l); if(tmp>max) max=tmp; } } printf("%d\n",max); } return 0;}
- 二维图中找最大子矩形的四道题
- 【转载】关于二维数组求最大子矩形
- 矩形子数组的最大和
- 最大子矩形
- 【最大子矩形】糖果盒
- 【最大子矩形】面积
- 【最大子矩形】面积
- 求二维矩阵的最大子矩阵
- 二维数组和最大的子矩阵
- 二维数组最大子矩阵的求和
- Maximal Rectangle 二维矩形中最大的1个数
- 最大二维子矩阵
- 【最大子矩形】棋盘制作
- 最大子矩形(SOJ3329)
- hdu 1506 最大子矩形
- uva 10827 求和最大可延伸的子矩形
- uva 1312 一个矩形中的最大的子矩形(其中不能包含某些点)
- 【二维DP】最大子阵
- MFC CListCtrl的用法
- javascript 实现拖动效果
- Android应用程序开发的四个重要组成部分
- test
- 过多if-else分支的优化
- 二维图中找最大子矩形的四道题
- usaco2.31Longest Prefix
- sql的联接查询
- Oracle 修改默认日期格式
- 开源工具 Docverter:文档工具 文档转换 转PDF
- 如何使用C语言写: Generic Queue
- [转]数据库设计中的14个技巧
- iPhone项目上增加支持iPad
- 全文索引--海量数据模糊查询