面积最大的全1子矩阵--九度OJ 1497
2015-05-10 22:39
387 查看
题目描述:
在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多。
输入:
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行是两个整数m、n(1<=m、n<=1000):代表将要输入的矩阵的大小。
矩阵共有m行,每行有n个整数,分别是0或1,相邻两数之间严格用一个空格隔开。
输出:
对应每个测试案例,输出矩阵中面积最大的全1子矩阵的元素个数。
样例输入:
样例输出:0 4
解题思路:转载自http://www.cnblogs.com/fstang/archive/2013/05/19/3087746.html
方法是:
1、先将0/1矩阵读入x,对每一个非零元素x[i][j],将其更新为:在本行,它前面的连续的1的个数+1(+1表示算入自身)
比如,若某一行为0 1 1 0 1 1 1,则更新为0 1 2 0 1 2 3
2、对每一个非零元素x[i][j],在第j列向上和向下扫描,直到遇到比自身小的数,若扫描了y行,则得到一个大小为x[i][j]*(y+1)的全1子矩阵(+1表示算入自身所在行)
比如,若某一列为[0 3 4 3 5 2 1]'(方便起见,这里将列表示成一个列向量),我们处理这一列的第4个元素,也就是3,它向上可以扫描2个元素,向下可以扫描1个元素,于是得到一个4×3的全1子矩阵。
3、在这些数值中取一个最大的。
思想大概如下图所示(空白处的0没有标出)
View Code
在一个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
解题思路:转载自http://www.cnblogs.com/fstang/archive/2013/05/19/3087746.html
方法是:
1、先将0/1矩阵读入x,对每一个非零元素x[i][j],将其更新为:在本行,它前面的连续的1的个数+1(+1表示算入自身)
比如,若某一行为0 1 1 0 1 1 1,则更新为0 1 2 0 1 2 3
2、对每一个非零元素x[i][j],在第j列向上和向下扫描,直到遇到比自身小的数,若扫描了y行,则得到一个大小为x[i][j]*(y+1)的全1子矩阵(+1表示算入自身所在行)
比如,若某一列为[0 3 4 3 5 2 1]'(方便起见,这里将列表示成一个列向量),我们处理这一列的第4个元素,也就是3,它向上可以扫描2个元素,向下可以扫描1个元素,于是得到一个4×3的全1子矩阵。
3、在这些数值中取一个最大的。
思想大概如下图所示(空白处的0没有标出)
#include<iostream> using namespace std; int main() { int n,m; while(cin>>n>>m){ int **array=new int* ; int **upperbound=new int* ; for(int i=0;i<n;i++){ array[i]=new int[m]; upperbound[i]=new int[m]; for(int j=0;j<m;j++){ cin>>array[i][j]; upperbound[i][j]=0; } } //prepare: for(int i=0;i<n;i++){ for(int j=1;j<m;j++){ if(array[i][j]==1&&array[i][j-1]!=0)array[i][j]=array[i][j-1]+1; } } //计算upperbound for(int j=0;j<m;j++){ for(int i=0;i<n;i++){ if(array[i][j]==0)continue; else{ int sum=0,temp=i; while(temp<n&&array[temp][j]>0){ sum+=array[temp][j]; temp++; } for(int k=i;k<temp;k++){ upperbound[k][j]=sum; } i=temp; } } } int maxarea=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(array[i][j]!=0&&maxarea<upperbound[i][j]){ int cnt=1,val=array[i][j]; for(int row=i-1;row>0;row--){ if(array[row][j]>=val)cnt++; else break;//这里一定要break } for(int row=i+1;row<n;row++){ if(array[row][j]>=val)cnt++; else break;//这里一定要break } if(cnt*val>maxarea)maxarea=cnt*val; } } } cout<<maxarea; } return 0; }
View Code
相关文章推荐
- 九度OJ 1497 面积最大的全1子矩阵 -- 动态规划
- 九度OJ 1497 面积最大的全1子矩阵 -- 动态规划
- 九度OJ 1497:面积最大的全1子矩阵(DP)
- 九度OJ; 题目1497:面积最大的全1子矩阵
- 九度1497:面积最大的全1子矩阵 (单调队列,单调栈)
- 九度1497:面积最大的全1子矩阵
- 九度 1497:面积最大的全1子矩阵
- 题目1497:面积最大的全1子矩阵
- 题目1497:面积最大的全1子矩阵
- [Jobdu] 题目1497:面积最大的全1子矩阵
- 题目1497:面积最大的全1子矩阵
- 腾讯面试题(九度)——面积最大的全1子矩阵
- JD 1497:面积最大的全1子矩阵
- 面积最大的全1子矩阵(腾讯2012年暑期实习生招聘面试二面试题)
- 面积最大的全1子矩阵
- 九度OJ 1139:最大子矩阵 (矩阵运算、缓存)
- 动态规划-面积最大的全1子矩阵
- 【九度OJ】题目1191:矩阵最大值 解题报告
- 九度1497(最大矩形面积+DP)
- 九度OJ 题目1191:矩阵最大值