UVa 836 - Largest Submatrix
2016-03-01 18:17
357 查看
题目:给你一个n*n的01矩阵,求里面最大的1组成的矩形的米娜及。
分析:dp。单调队列。UVa 1330同题,仅仅是输入格式变了。
我们将问题分解成最大矩形。即求解以k行为底边的图形中的最大矩形。然后合并。求最大的矩形。
预处理: 求出以每行为底边的每一列从底边開始向上的最大连续1的高度MaxH。
O(N^2) ;
dp:对于每一层底边。我们利用单调队列求解出本行的最大矩形。 O(N)。
关于单调队列的求解分析,可參照zoj1985的题解;
整体时间:T(N) = O(N^2)+O(N)*O(N) = O(N^2)。
说明:注意数据读入格式。
分析:dp。单调队列。UVa 1330同题,仅仅是输入格式变了。
我们将问题分解成最大矩形。即求解以k行为底边的图形中的最大矩形。然后合并。求最大的矩形。
预处理: 求出以每行为底边的每一列从底边開始向上的最大连续1的高度MaxH。
O(N^2) ;
dp:对于每一层底边。我们利用单调队列求解出本行的最大矩形。 O(N)。
关于单调队列的求解分析,可參照zoj1985的题解;
整体时间:T(N) = O(N^2)+O(N)*O(N) = O(N^2)。
说明:注意数据读入格式。
#include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; char maps[30][30]; char Maps[30][30]; int MaxH[30][30]; int L[30],R[30]; int MUQ[30]; int main() { int T; scanf("%d",&T);getchar(); for (int t = 1 ; t <= T ; ++ t) { scanf("%s",maps[0]); int n = strlen(maps[0]); for (int i = 1 ; i < n ; ++ i) scanf("%s",maps[i]); for (int i = 1 ; i <= n ; ++ i) for (int j = 1 ; j <= n ; ++ j) Maps[i][j] = maps[i-1][j-1]; //计算每条底边上的每列高度 memset(MaxH, 0, sizeof(MaxH)); for (int i = 1 ; i <= n ; ++ i) for (int j = 1 ; j <= n ; ++ j) if ( Maps[i][j] == '1' ) MaxH[i][j] = MaxH[i-1][j]+1; else MaxH[i][j] = 0; for (int i = 1 ; i <= n ; ++ i) MaxH[i][0] = MaxH[i][n+1] = -1; int MaxV = 0; for (int i = 1 ; i <= n ; ++ i) { //计算每一个点的左边界 int tail = 0; MUQ[0] = 0; for (int j = 1 ; j <= n+1 ; ++ j) { while (tail >= 0 && MaxH[i][MUQ[tail]] > MaxH[i][j]) R[MUQ[tail --]] = j; MUQ[++ tail] = j; } //计算每一个点的右边界 tail = 0; MUQ[0] = n+1; for (int j = n ; j >= 0 ; -- j) { while (tail >= 0 && MaxH[i][MUQ[tail]] > MaxH[i][j]) L[MUQ[tail --]] = j; MUQ[++ tail] = j; } //求解 for (int j = 1 ; j <= n ; ++ j) { int Temp = MaxH[i][j]*(R[j]-L[j]-1); if (MaxV < Temp) MaxV = Temp; } } printf("%d\n",MaxV); if (t < T) printf("\n"); } return 0; }
相关文章推荐
- 【opencv】图像细化
- 另一种dump bootimg(zImage)的方法
- Linux任务前后台的切换
- 【Educational Codeforces Round 6A】【水题】Professor GukiZ's Robot 曼哈顿距离
- 添加页面切换动画, 避免冷启动
- 判断一个文本文件的编码格式
- 申请 SSL 证书 并且配置 iis 启用https协议
- 安装mariadb galera 10.0.22(二进制)
- 【小镇的技术天梯】黑客技术(1) MITM-中间人攻击
- Jstl标签的使用
- 二:Storm的配置项说明
- QT 同时支持鼠标和触摸屏
- android开发练习五-添加一个listview
- React-native 知识点-this.bind-返回键-React.cloneElement-控件显示隐藏-ScrollView
- HIVE2.0.0安装遇到的问题
- IOS 上传ipa文件失败
- win系统下node.js安装及环境配置.
- 2016.3.1
- angularjs手记-2016-03-01
- 蓝桥杯历届-打印十字图