hdu 1505

hdu 1506的加强版

看了大牛的思路才会做

对每一行做一次1506的算法

不会的看博客hdu 1506

http://blog.csdn.net/talak/article/details/8108137

 代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
using namespace std;
int l[1005][1005];
int r[1005][1005];
int num[1005][1005];
int dp[1005][1005];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            char knum[3];
            scanf("%s",knum);
            if(knum[0]=='F')
            {
                dp[i][j]=dp[i-1][j]+1;
            }
            else
            dp[i][j]=0;
        }
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        l[i][j]=j,r[i][j]=j;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            while(l[i][j]-1>0&&dp[i][l[i][j]-1]>=dp[i][j])
            {
                l[i][j]=l[i][l[i][j]-1];
            }
        }
        for(int i=1;i<=n;i++)
        for(int j=m;j>=1;j--)
        {
            while(r[i][j]+1<=m&&dp[i][r[i][j]+1]>=dp[i][j])
            {
                r[i][j]=r[i][r[i][j]+1];
            }
        }
        int maxn=-1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                int num=r[i][j]-l[i][j]+1;
                if(num*dp[i][j]*3>maxn)
                maxn=num*dp[i][j]*3;
            }
        }
        printf("%d\n",maxn);
    }
}



你可能感兴趣的:(hdu 1505)