LA3029
2016-01-25 15:17
281 查看
题目大意:
求空地F的最大矩形,求最大子矩阵
思路:
用三个数组up,l,r分别表示举行的高度,左边界,右边界。
lo 表示左边最近障碍格的列编号。
ro表示右边最近障碍格的列编号。
先从左到右维护左边界。
如果是有障碍的话 那么up [i][j] = 0,l[i][j] = 0,lo = j;
当i是第一行的时候
如果没有障碍的话 那么up[i][j] = 1,l[i][j] = lo + 1;
如果不是第一行而且没有障碍的话
up = up[i - 1][j] + 1;
l[i][j] = max(l[i - 1][j],lo + 1);
从右到左维护右边界。
如果有障碍的话
r[i][j] = n; ro = j;
如果没有障碍的话
第一行:
r[i][j] = ro - 1;
否则
r[i][j] = min(ro - 1,r[i - 1][j]);
代码:
求空地F的最大矩形,求最大子矩阵
思路:
用三个数组up,l,r分别表示举行的高度,左边界,右边界。
lo 表示左边最近障碍格的列编号。
ro表示右边最近障碍格的列编号。
先从左到右维护左边界。
如果是有障碍的话 那么up [i][j] = 0,l[i][j] = 0,lo = j;
当i是第一行的时候
如果没有障碍的话 那么up[i][j] = 1,l[i][j] = lo + 1;
如果不是第一行而且没有障碍的话
up = up[i - 1][j] + 1;
l[i][j] = max(l[i - 1][j],lo + 1);
从右到左维护右边界。
如果有障碍的话
r[i][j] = n; ro = j;
如果没有障碍的话
第一行:
r[i][j] = ro - 1;
否则
r[i][j] = min(ro - 1,r[i - 1][j]);
代码:
#include <iostream> using namespace std; #include <stdio.h> #include <cstring> #include <algorithm> const int maxn = 1000; int map[maxn][maxn],l[maxn][maxn],r[maxn][maxn],up[maxn][maxn]; int main() { int T; scanf("%d",&T); int m,n; char c; while(T--) { scanf("%d %d",&m,&n); for(int i = 0 ; i < m; i++) { for(int j = 0; j < n ; j++) { //scanf("%c",&c); c = getchar(); while(c != 'R' && c!='F') c = getchar(); if(c == 'F') map[i][j] = 0; else map[i][j] = 1; } } int lo = 0,ro = n; int ans = 0; for(int i = 0; i < m; i++) { lo = -1,ro = n; for(int j = 0; j <n ; j++) { // if(i == 0) { if(map[i][j] == 1) { lo = j; up[i][j] = 0; l[i][j] = 0; } else { if(i == 0) { up[i][j] = 1; l[i][j] = lo +1; } else { up[i][j] = up[i - 1][j] + 1; l[i][j] = max (lo + 1,l[i - 1][j]); } } } for(int j = n - 1; j >= 0; j--) { if(map[i][j] == 1) { ro = j; // up[i][j] = 0; r[i][j] = n; } else { if(i == 0) { // up[i][j] = 1; r[i][j] = ro - 1; } else { // up[i][j] = up[i - 1][j] + 1; r[i][j] = min(ro - 1,r[i - 1][j]); } } ans = max(ans, (r[i][j] - l[i][j] + 1) * up[i][j]); } } printf("%d\n",ans*3); } return 0; }
相关文章推荐
- MyEclipse的优化与快捷键的设置
- JavaScript arguments对象
- HTTP权威指南学习笔记
- nodejs 项目编译
- Python爬虫实战六之抓取爱问知识人问题并保存至数据库
- iOS 根据 crash 崩溃 报告的内存地址定位到代码位置
- PHPCMS代码生成器
- Json的介绍与使用
- POJ 1700
- linux vi命令保存
- Java Annotation注解语法
- SQL--工作中遇到的
- Delphi获取其它进程窗口句柄的3种方法
- 类的继承 保护继承和私有继承
- Android Studio安装:Unable to access Android SDK add-on list
- 299. Bulls and Cows ——猜数字游戏
- Fragment与宿主Activity都调用startActivityForResult,onActivityResult不执行解决办法
- apache kafka源代码工程环境搭建(IDEA)
- 树状数组(2)
- leetcode之Valid Palindrome