【难】【DP】计算bool矩阵中,仅包含1的最大矩形和最大正方形
来源:互联网 发布:穷游软件 编辑:程序博客网 时间:2024/04/27 22:51
题目:EPI
class record{public:int right;//如果一个点是1,则记录该点右边有多少个连续的1(包括该点本身)int down;//如果一个点是1,则记录该点下边有多少个连续的1(包括该点本身)record(){}record(int r,int d):right(r),down(d){}};//计算最大矩形区域int find_largest_rectangle(const vector<vector<bool>> &A){if(A.empty() || A[0].empty())return -1;int rows=A.size(),cols=A[0].size();vector<vector<record>> m(rows,vector<record>(cols));for(int i=rows-1;i>=0;i--){for(int j=cols-1;j>=0;j--){if(A[i][j]){int r=j==cols-1?1:m[i][j+1].right+1;int d=i==rows-1?1:m[i+1][j].down+1;m[i][j]=record(r,d);}elsem[i][j]=record(0,0);}}int res=0;for(int i=rows-1;i>=0;i--){for(int j=cols-1;j>=0;j--){if(A[i][j] && m[i][j].down*m[i][j].right>res){int min_r=m[i][j].right;for(int k=0;k<m[i][j].down;k++){min_r=min(min_r,m[i+k][j].right);int tmp=(k+1)*min_r;res=max(res,tmp);}}}}return res;}//计算最大正方形区域int find_largest_square(const vector<vector<bool>> &A){if(A.empty() || A[0].empty())return -1;int rows=A.size(),cols=A[0].size();vector<vector<record>> m(rows,vector<record>(cols));for(int i=rows-1;i>=0;i--){for(int j=cols-1;j>=0;j--){if(A[i][j]){int r=j==cols-1?1:m[i][j+1].right+1;int d=i==rows-1?1:m[i+1][j].down+1;m[i][j]=record(r,d);}elsem[i][j]=record(0,0);}}int res=0;//side记录一个点作为正方形的左上角时,所能获得的最大边长的正方形vector<vector<int>> side(rows,vector<int>(cols,0));for(int i=rows-1;i>=0;i--){for(int j=cols-1;j>=0;j--){if(A[i][j]){int s=min(m[i][j].right,m[i][j].down);if(i<rows-1 && j<cols-1)s=min(s,side[i+1][j+1]+1);side[i][j]=s;res=max(res,s*s);}}}return res;}
相关题型:《程序员面试金典》P345
给定一个bool类型的方阵,设计一个算法,找出四条边皆为1的最大子方阵。
class record{public:int right;//如果一个点是1,则记录该点右边有多少个连续的1(包括该点本身)int down;//如果一个点是1,则记录该点下边有多少个连续的1(包括该点本身)record(){}record(int r,int d):right(r),down(d){}};//矩阵中以点A[row][col]为左上角、边长为side的正方形class square{public:int row,col;int side;square(int r,int c,int s):row(r),col(c),side(s){}};bool Issquare(const vector<vector<bool>> &A,const vector<vector<record>> &m,const int row,const int col,const int side){if(m[row+side-1][col].right<side)return false;if(m[row][col+side-1].down<side)return false;return true;}square find_largest_square_one_encircle(const vector<vector<bool>> &A){square res(-1,-1,-1);if(A.empty() || A.size()!=A[0].size())return res;int n=A.size();vector<vector<record>> m(n,vector<record>(n));for(int i=n-1;i>=0;i--){for(int j=n-1;j>=0;j--){if(A[i][j]){int r=j==n-1?1:m[i][j+1].right+1;int d=i==n-1?1:m[i+1][j].down+1;m[i][j]=record(r,d);}elsem[i][j]=record(0,0);}}for(int i=n-1;i>=0;i--){for(int j=n-1;j>=0;j--){if(A[i][j]){int side=min(m[i][j].right,m[i][j].down);if(side<=res.side)continue;while(side>res.side){if(Issquare(A,m,i,j,side)){res.row=i;res.col=j;res.side=side;break;}elseside--;}}}}return res;}
测试代码:
bool a[4][4]={{0,0,1,0},{0,1,1,1},{1,1,1,1},{0,1,1,1}};vector<vector<bool>> A(4,vector<bool>(4));for(int i=0;i<4;i++)for(int j=0;j<4;j++)A[i][j]=a[i][j];cout<<find_largest_rectangle(A);
0 0
- 【难】【DP】计算bool矩阵中,仅包含1的最大矩形和最大正方形
- DP---求给定矩阵中最大正方形的维度
- 柱状图中找最大矩形 & 矩阵中找最大的仅含相同值的矩形区域
- 【难】【DP】计算“skyline”下的最大矩形面积
- LintCode-最大正方形&最大矩形
- 算法题:直方图和0-1矩阵中最大矩形
- 给定填充0和1的二维二进制矩阵,找到包含所有的最大矩形并返回其区域。
- 【最大矩阵和】最大加权矩形 rqnoj106
- 最大子段和||最大子矩阵和||最大全1子矩阵||最大全1子正方形||
- 最大子段和||最大子矩阵和||最大全1子矩阵||最大全1子正方形||
- 01矩阵最大正方形
- 最大正方形子矩阵
- dp 最大矩阵和
- 【BashuOJ2041】最大矩形-矩阵型DP
- 最大正方形 DP
- 数组与矩阵---边界都是1的最大正方形大小
- 01二维矩阵中最大全为1的正方形maxSquare
- 0 1 矩阵查找最大正方形
- android开发之对比版本号
- 保存图片为svg格式
- 仿QQ头像透明圆图剪切(CAShapeLayer 和 UIBezierPath的使用)
- iBatis批量插入数据记录操作
- 多队列网卡特性
- 【难】【DP】计算bool矩阵中,仅包含1的最大矩形和最大正方形
- DSP中的基础算法和模型的详细解析
- xUtils简介及其使用方法
- 【Android 一般进阶】android自定义属性的使用
- 简单滑动门
- gdb基础命令和常用操作补充
- android布局文件px、in、mm、pt、dp、sp等详解
- MyEclipse10.6+CDT+MinGW配置说明
- Windows下GitBash 下载Andriod Kernel