洛谷P4147 玉蟾宫(悬线法dp)

本文详细介绍了P4147玉蟾宫问题的解决策略,采用悬线DP方法,通过预处理确定左右边界,记录可达最高高度,最终求解最大矩形面积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P4147 玉蟾宫

题解:悬线 d p dp dp,先预处理出悬线的左右边界。 h h h数组记录能到的最高高度。然后 m a x ( h ( i , j ) ∗ ( R i g h t ( i , j ) − L e f t ( i , j ) + 1 ) max(h(i,j)∗(Right(i,j)−Left(i,j)+1) max(h(i,j)(Right(i,j)Left(i,j)+1)即可。

代码

#include<bits/stdc++.h>
const int N = 1010;
using namespace std;
int n,m,rectangle,a[N][N],Left[N][N],Right[N][N],h[N][N];

int main()
{
#ifndef ONLINE_JUDGE
    freopen("input.in","r",stdin);
#endif
    char c;
    cin>>n>>m;
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m; ++j){
            cin>>c;
            a[i][j] = c == 'F' ? 1 : 0;
            Left[i][j] = Right[i][j] = j;
            h[i][j] = 1;
        }
    }
    for(int i = 1; i <= n; ++i){
        for(int j = 2; j <= m; ++j){
            if(a[i][j] == a[i][j - 1] && a[i][j] == 1) Left[i][j] = Left[i][j - 1];
        }
    }
    for(int i = 1; i <= n; ++i){
        for(int j = m - 1; j >= 1; --j){
            if(a[i][j] == a[i][j + 1] && a[i][j] == 1) Right[i][j] = Right[i][j + 1];
        }
    }
    for(int i = 1; i <= m; ++i) Left[0][i] = 0, Right[0][i] = m + 1;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j) {
            if(a[i][j] == a[i - 1][j] && i != 1 && a[i][j] == 1) {
                h[i][j] += h[i - 1][j];
                Left[i][j] = max(Left[i][j],Left[i - 1][j]);
                Right[i][j] = min(Right[i][j],Right[i - 1][j]);
            }
            rectangle = max(rectangle, h[i][j] * (Right[i][j] - Left[i][j] + 1));
        }
    cout<<rectangle * 3<<endl;
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值