HRBUST 1786 最大停车场 (01矩阵找最大的矩形)

来源:互联网 发布:噩梦 知乎 编辑:程序博客网 时间:2024/06/06 04:25

题目:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1786

代码:

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;char maps[1005][1005];int book[1005][1005];int solve(int wist[], int n){    //int hist[6]={3,2,2,0,0};    int* arr = new int[n];// 申请一个额外的数组    arr[0] = hist[0];    int max = hist[0]; // 最大面积    for(int i=1; i<n; i++)    {        arr[i] = hist[i];        for(int j=i-1; j>=0; j--)        {            if(arr[j]>arr[i])            {                if(arr[j]*(i-j)>max)                {                    max = arr[j]*(i-j);                }                arr[j] = arr[i];            }            else break;            //数组arr里的元素,保持非递减的顺序。            printf("%d ",arr[j]);        }    }    /*for(int i=0;i<n;i++)    {        printf("%d ",arr[i]);    }    printf("%d ",max);*/    //重新扫描一边,以更新最大面积    for(int i=0; i<n; i++)    {        if(arr[i]*(n-i)>max)        {            max = arr[i]*(n-i);        }    }    //printf("%d \n",max);    return max;}int main(){    //freopen("B.in.txt","r",stdin);    //freopen("B.out.txt","w",stdout);    int t;    scanf("%d",&t);    while(t--)    {        memset(book,0,sizeof(book));        int n,m;        scanf("%d%d",&n,&m);        for(int i=0; i<n; i++)        {            for(int j=0; j<m; j++)            {                getchar();                scanf("%c",&maps[i][j]);            }        }        for(int i=0; i<n; i++)        {            for(int j=0; j<m; j++)            {                if(i==0)                {                    if(maps[i][j]=='F')                        book[i][j]=1;                }                else                {                    if(book[i-1][j]!=0&&maps[i][j]=='F')                    {                        book[i][j]=book[i-1][j]+1;                    }                    else if(book[i-1][j]==0&&maps[i][j]=='F')                    {                        book[i][j]=1;                    }                }            }        }        int ans=0;        for(int i=0; i<n; i++)        {            ans=max(ans,solve(book[i],m));        }        printf("%d\n",ans);    }}

当个模板题吧。

0 0