POJ - 1964 City Game

原创 2013年12月01日 21:21:47

题意:给定一个m*n的矩阵,其中一些格子是空地F,其他的是障碍R,找出一个最大的全部有F组成的面积最大的矩阵,输出面积乘以3的结果

思路: 用简单的枚举左上角坐标,长,宽显然是会超时的,这里有一种求极大子矩阵问题的方法:用up(i,j),left(i,j),right(i,j)分别表示某个点的最大的上连续的空地长度和向左可以得到相同up的最大宽度,以及向右可以得到的相同up的最大宽度,还用lo,ro分别表示距离左右的最近障碍的列

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1000;

int mat[MAXN][MAXN],up[MAXN][MAXN],Left[MAXN][MAXN],Right[MAXN][MAXN];

int main(){
    int t;
    scanf("%d",&t);
    while (t--){
        int n,m;
        scanf("%d%d%*c",&m,&n);
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++){
                int ch = getchar();
                while (ch != 'F' && ch != 'R')
                    ch = getchar();
                mat[i][j] = ch == 'F' ? 0 : 1;
            }
        int ans = 0;
        for (int i = 0; i < m; i++){
            int lo = -1,ro = n;
            for (int j = 0; j < n; j++)
                if (mat[i][j] == 1){
                    up[i][j] = Left[i][j] = 0;
                    lo = j;
                }
                else {
                    up[i][j] = i == 0 ? 1 :up[i-1][j] + 1;
                    Left[i][j] = i == 0 ? lo+1 :max(Left[i-1][j],lo+1);
                }

            for (int j = n-1; j >= 0; j--)
                if (mat[i][j] == 1){
                    Right[i][j] = n;
                    ro = j;
                }
                else {
                    Right[i][j] = i == 0 ? ro-1 : min(Right[i-1][j],ro-1);
                    ans = max(ans,up[i][j]*(Right[i][j]-Left[i][j]+1));
                }
        }
        printf("%d\n",ans*3);
    }
    return 0;
}



相关文章推荐

POJ 1964 City Game

单调栈

【BZOJ3039】玉蟾宫/【HDU1505】【POJ1964】City Game 最大01子矩阵

转载请注明出处: 首先我们可以用单调栈每行扫一遍,维护一个点向上下左右各能延伸多长。 当然,这是可以做的,也是很恶心的。 我们可以每行扫一遍,维护每个点当前的[列高度]时能向左向右的最大延伸距离。...
  • Vmurder
  • Vmurder
  • 2015年01月19日 22:05
  • 1617

poj2559 Largest Rectangle in a Histogram hdu1505 City Game

POJ2559 题意: 在直方图中找出最大矩形 如图,输入数据为 7 2 1 4 5 1 3 3 7为个数,直方图如上图 枚举所有宽为1的矩形,往两边扩充,找出完整包含...

【POJ 1964】求10图矩形最大面积

星爷代码: 思想——维护左上角的单调栈 #include #include #include using namespace std; int main(){ int casen...

poj 1964 DP 求最大子矩形面积

求最大子矩形面积
  • sky_zdk
  • sky_zdk
  • 2017年05月25日 12:30
  • 198

poj 1964

转自http://blog.csdn.net/SMCwwh/article/details/5945855 题目大意是要你一个子矩阵,能使得覆盖未占用的连续区域最大 思路:动态规划 按行来划分状...

POJ2566 ZOJ1964 Bound Found【前缀和+排序+尺取法】

Bound Found Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4085   Ac...

hdu 1505 City Game(最大子矩阵)

Problem Description Bob is a strategy game programming specialist. In his new city building game th...

hdu 1505 City Game(DP)

City Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota...
  • caduca
  • caduca
  • 2014年08月29日 23:07
  • 3541

【DP】 hdu1505 City Game

City Game http://acm.hdu.edu.cn/showproblem.php?pid=1505 Problem Description Bob is a s...
  • ACM_Ted
  • ACM_Ted
  • 2012年08月09日 16:16
  • 1839
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ - 1964 City Game
举报原因:
原因补充:

(最多只允许输入30个字)