洛谷4147 悬线DP

题目链接:(https://www.luogu.com.cn/problem/P4147)
题目大意:

题目背景

有一天,小猫 rainbow 和 freda 来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。

题目描述

这片土地被分成 N×M 个格子,每个格子里写着 'R' 或者 'F',R 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 freda。

现在 freda 要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着 'F' 并且面积最大。

但是 rainbow 和 freda 的 OI 水平都弱爆了,找不出这块土地,而蓝兔也想看 freda 卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为 S,它们每人给你 S 两银子。

输入格式

第一行两个整数 N,M,表示矩形土地有 N 行 M 列。

接下来 N 行,每行 M 个用空格隔开的字符 'F' 或 'R',描述了矩形土地。

输出格式

输出一个整数,表示你能得到多少银子,即 (3×最大 ’F’ 矩形土地面积) 的值。

输入输出样例
输入 #1复制
5 6
R F F F F F
F F F F F F
R R R F F F
F F F F F F
F F F F F F
输出 #1复制
45
说明/提示
对于 50%50% 的数据,1 ≤N,M≤200

对于 100%100% 的数据,1 ≤N,M ≤1000

思路

线DP
l[i][j]:(i,j)F,
r[i][j]:(i,j)F,
up[i][j]:(i,j)
(i,j):ans=max(ans,r[i][j]l[i][j]+1)up[i][j])

l[][],r[][]up[i][j]up[i1][j]dp

#include<bits/stdc++.h>
#define LL long long
using namespace std;

inline int Readc(){
    char c=getchar();
    while(c!='R'&&c!='F')c=getchar();
    if(c=='F')return 1;
    return 0;
}//快读(应该比较好理解吧)

int s[1005][1005];
int l[1005][1005], r[1005][1005], up[1005][1005];
int main(){

    int n, m; scanf("%d%d", &n, &m);
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            s[i][j]=Readc();
            l[i][j]=r[i][j]=j;
            up[i][j]=1;
        }
    }
    for(int i=1; i<=n; i++){//预处理l[][]
        for(int j=2; j<=m; j++){
            if(s[i][j]==1&&s[i][j-1]==1){
                l[i][j]=l[i][j-1];
            }
        }
    }

    for(int i=1; i<=n; i++){//预处理r[][]
        for(int j=m-1; j>=1; j--){
            if(s[i][j]==1&&s[i][j+1]==1){
                r[i][j]=r[i][j+1];
            }
        }
    }

    int ans=0;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            if(i>1&&s[i][j]==1&&s[i-1][j]==1){//DP
                l[i][j]=max(l[i][j], l[i-1][j]);
                r[i][j]=min(r[i][j], r[i-1][j]);
                up[i][j]=up[i-1][j]+1;
            }
            ans=max(ans, (r[i][j]-l[i][j]+1)*up[i][j]);
        }
    }

    printf("%d\n", ans*3);

    return 0;

}

总结

n*m 比较小用DP法
s^2 比较小用扩展法

posted @   liweihang  阅读(126)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
Live2D
欢迎阅读『洛谷4147 悬线DP』
点击右上角即可分享
微信分享提示