DP激情奉献(四)hdu1505加强版1506

来源:互联网 发布:阿里云免费主机申请 编辑:程序博客网 时间:2024/06/07 10:25
//本题是hdu1506的强化版本.题目大意是这样的:有一片土地.标记F为"空地",标记R为"已建造"
//现在要在这个m*n的空间里面找到一个最大矩形...
//处理方式:把每一行作为底行来可以形成一个状图,这样预处理以后就可以类似hdu1506那样的做..
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int m,n,dp[2222][2222],r[2222],l[2222];
bool map[2222][2222];
char s[2111];
int main()
{
    int test;
    while( scanf("%d",&test) != EOF)
    {
        while(test--)
        {
            scanf("%d%d",&m,&n);
            for(int i = 1 ; i <= m ; i++)
            {
                for(int j = 1 ; j <= n ; j++)
                {
                    scanf("%s",s);
                    if(s[0] == 'R')
                        map[i][j] = 0;
                    else if(s[0] == 'F')
                        map[i][j] = 1;
                }
            }
            memset(dp,-1,sizeof(dp));
            for(int i = 1 ; i <= n ; i++)
                dp[1][i] = map[1][i];
            for(int i = 2 ; i <= m ; i++)
            {
                for(int j = 1 ; j <= n ; j++)
                {
                    if(map[i][j])dp[i][j] = dp[i-1][j] + map[i][j];
                    else dp[i][j] = 0;
                }
            }
            int ans = 0;
            for(int i = 1 ; i <= m ; i++)
            {
                for(int j = 1 ; j <= n ; j++)
                {
                    r[j] = j;
                    l[j] = j;
                }
                for(int j = 1 ; j <= n ; j++)
                {
                    while(dp[i][l[j]-1] >= dp[i][j])
                        l[j] = l[l[j]-1];
                }
                for(int j = n ; j >= 1 ; j--)
                {
                    while(dp[i][r[j]+1] >= dp[i][j])
                        r[j] = r[r[j]+1];
                }
                //  printf("%d\n",i);
                for(int j = 1 ; j <= n ; j++)
                {
                    int x = (r[j] - l[j] + 1)*dp[i][j];
                    ans = max(ans,x);
                    // printf("%d  %d  %d  %d %d\n",j,r[j],l[j],dp[i][j],x);
                }
            }
            if(ans < 0)while(1);
            printf("%d\n",3*ans);
        }
    }
}