首页 > 其他分享 >P4147 玉蟾宫

P4147 玉蟾宫

时间:2024-03-10 14:45:14浏览次数:21  
标签:cnt 玉蟾 int top 端点 ans P4147 row

原题链接

题解

太巧妙了

把每个点上方的连续f长度记录下来,然后求每行的柱状图构成的矩形的最大面积

code


#include<bits/stdc++.h>
using namespace std;
int f[1005][1005]={0};
int n,m;

struct node
{
    int h,cnt;
};

int solve(int row)//每一行列上的高度,如果全部使用,不是作为左端点就是作为右端点
{
    int ans=0;
    stack<node> q;//相当于求左边最远小于自己的值,右边最远小于自己的值,单调栈解法
    for(int j=1;j<=m;j++)
    {
        int cnt=0;
        while(q.size()&&q.top().h>=f[row][j])
        {
            cnt+=q.top().cnt;//cnt代表这个点收纳了多少点
            ans=max(ans,q.top().h*cnt);//作为左端点更新,即后边遇到了比自己更小的值,然后弹出
            q.pop();//如果弹出,代表遇到了作为左端点的最远距离的点
        }

        ans=max(ans,f[row][j]*(cnt+1));//作为右端点更新,找到左边比自己小的点
        q.push({f[row][j],cnt+1});//cnt代表该元素左边有多少不小于自己的(包括自己)
    }

    int cnt=0;
    while(q.size())//有些元素没有作为左端点更新过
    {
        ans=max(ans,(cnt+1)*q.top().h);
        cnt+=q.top().cnt;
        q.pop();
    }
    return ans;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            char op;
            cin>>op;
            if(op=='F') f[i][j]=f[i-1][j]+1;//记录以该点为下端点,最长连续f的长度
        }
    }

    int ans=0;
    for(int i=1;i<=n;i++)
    {
        ans=max(ans,solve(i));//变成求每行的最大矩形
    }

    cout<<3*ans;
    return 0;
}

标签:cnt,玉蟾,int,top,端点,ans,P4147,row
From: https://www.cnblogs.com/pure4knowledge/p/18064169

相关文章

  • 玉蟾宫
    玉蟾宫题目描述有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。这片土地被分成N*M个格子,每个格子里写着’R’或者’F’,R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。现在freda要在这里卖萌。。。它......
  • 玉蟾宫(单调栈)
    玉蟾宫(单调栈)题目描述有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。这片土地被分成N*M个格子,每个格子里写着’R’或者’F’,R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。现在freda要在这里......
  • 玉蟾宫 题解
    题目描述有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。这片土地被分成N*M个格子,每个格子里写着’R’或者’F’,R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。现在freda要在这里卖萌。。。它要找一块......
  • 玉蟾宫(悬线dp)
    求最大子矩阵一般用采用悬线法(包好用的牢底)悬线法:[以这道题为例,我们将R称为障碍格子,将F称为非障碍格子]我们选择任意一个非障碍格子,引出三条直线:左直右直上直随后从这个点出发,分别向上左右延申直到遇到障碍格我们要求上悬线尽可能高的面积,但有可能上一......
  • P4147 玉蟾宫 题解
    P4147玉蟾宫题解题目链接P4147玉蟾宫简要思路很容易发现,这是最大子矩形问题的板子题。定义一个二维的\(dp\)数组,\(dp_{i,j}\)代表以坐标\((i,j)\)为底的线段,最长能向上延伸多少个单位长度的F(如果自身为R,值则为\(0\))。对于\(dp\)数组的维护,分为两种情况:当\(......