题目链接

【题解】

把所有的"1"矩形分成m类。
第j类的矩形。他的右边界跟第j列紧靠。
那么。
我们设f[i][j]表示(i,j)这个点往左最长能延伸多少个数目的"1"
那么对于第j类的矩形。
我们会发现。问题转化为求一个侧着放的柱状图。
然后让你在其中找到最大面积的矩形。且要求紧贴着底面(也即第j列)
那么问题就抓换成[这道题](https://www.cnblogs.com/AWCXV/p/11934410.html)了。
做一个O(N)的单调队列就能解决。
所以总的复杂度就是O(N^2)的。

【代码】

class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if (matrix.empty()) return 0;
if (matrix[0].empty()) return 0;
int n = matrix.size();
int m = matrix[0].size();
int f[1005][1005];
memset(f,0,sizeof(f));
for (int i = 0;i < n;i++)
for (int j = 0;j < m;j++){
if (matrix[i][j]=='1'){
f[i+1][j+1] = f[i+1][j]+1;
}
}
int h[1005],sta[1005];
memset(h,0,sizeof(h));memset(sta,0,sizeof(sta));
int top;
int ma = 0;
for (int j = 1;j <= m;j++){
for (int i = 1;i <= n;i++){
h[i] = f[i][j];
}
top = 1;
sta[1] = 0;
for (int i = 1;i <= n;i++){
while (top!=1 && h[sta[top]]>h[i]){
ma = max(ma,h[sta[top]]*(i-1-sta[top-1]));
top--;
}
sta[++top] = i;
}
while (top>1){
ma = max(ma,h[sta[top]]*(n-sta[top-1]));
top--;
}
}
return ma;
}
};

最新文章

  1. Html.DropDownList
  2. 我的c++学习(6)默认参数和内联函数
  3. android中的EditView控件
  4. 【原创】lua编译时发现缺少readline库
  5. 关于crontab笔记
  6. sniffer 简介
  7. CSS像素、物理像素、逻辑像素、设备像素比、PPI、Viewport
  8. 获取完全一样的数据库,包括表与表之间的外键关系,check,default表结构脚本
  9. ansible配合shell脚本批量编译安装python3.6.6
  10. linux下从一台服务器复制文件或文件夹到本地
  11. asp.net session锁导致ajax请求阻塞
  12. Annotations
  13. 前端如何应对笔试算法题?(用node编程)
  14. 【API】网络编程模型、多线程
  15. thinkphp中的Ueditor的使用, 以及如何传递编辑器内容到后台?
  16. start with...connect by子句的浅用
  17. shell、cmd、dos和脚本语言区别和联系
  18. 简单配置AAA认证与telnet图解
  19. visible, disable, css绑定
  20. return阻止js继续向下执行

热门文章

  1. ruby file
  2. Windows命令学习
  3. scrapy-redis源码浅析
  4. JSP 学习笔记1
  5. JSP_01
  6. 高级软件工程第二次作业:随机生成N个不重复的已解答完毕的数独棋盘
  7. Linux命令行基础操作
  8. Windows禅道环境部署
  9. [Codeforces 364D]Ghd(随机算法+gcd)
  10. 2019牛客暑期多校训练营(第一场) - B - Integration - 数学