hdu 1505 dp

题意:这道题是1506的加强版,实际上1506就是它的一个子问题,给你一张地图,上面有的区域被占据了,由P来表示,有的区域是空的,由F来表示,叫你找一个最大的矩形,矩形内要求全是空的地,答案就是最大的矩形的面积乘上3,输出就可以了

思路:就是枚举,将第i行选作矩形的底,再算出每块地的上方由多少个空地,然后就便成了1506的问题了,如果不会的话可以看下我hdu 1506 的题解,求出所有的答案,最大值就是答案。


#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

int high[1010][1010];
int l[1010],r[1010];

int main()
{
    int cas;
    cin>>cas;
    while(cas--){
        char c[10];
        memset(high,0,sizeof(high));
        int n,m;
        cin>>n>>m;
        int ans=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf("%s",&c);
                if(c[0]=='F')
                    high[i][j]=high[i-1][j]+1;
                else high[i][j]=0;
            }
        }
        for(int i=1;i<=n;i++){
            l[1]=0;r[m]=m+1;
            for(int j=2;j<=m;j++){
                int x=j-1;
                while(x&&high[i][j]<=high[i][x])
                    x=l[x];
                l[j]=x;
            }
            for(int j=m-1;j>0;j--){
                int x=j+1;
                while(x<=m&&high[i][j]<=high[i][x])
                    x=r[x];
                r[j]=x;
            }
            for(int j=1;j<=m;j++)
                ans=max(ans,high[i][j]*(r[j]-l[j]-1));
        }
        cout<<ans*3<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值