Live2D

玉蟾宫(悬线dp)


求最大子矩阵一般用采用悬线法 (包好用的牢底)
悬线法:

  • [ 以这道题为例,我们将R称为障碍格子,将F称为非障碍格子]
  • 我们选择任意一个非障碍格子,引出三条直线:左直 右直 上直

  • 随后从这个点出发,分别向上 左 右延申直到遇到障碍格

我们要求上悬线尽可能高的面积, 但有可能上一层的左直线比这一层短,所以不能直接傻傻地用上*(右-左+1);
所以要让左悬线尽可能大,右悬线尽可能小
最后轮流求每个非障碍点能延伸到的最大面积

公主请欣赏代码
#include<bits/stdc++.h> using namespace std; const int N = 1e3+10; int n, m, ans; char a[N][N]; int h[N][N], l[N][N], r[N][N]; int main(){ scanf("%d%d", &n, &m); for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++){ cin >> a[i][j]; h[i][j] = 1; l[i][j] = r[i][j] = j;//将悬线都初始化 } } for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++){ if(a[i][j] == 'F' and a[i][j-1] == 'F') l[i][j] = l[i][j-1];//延伸左悬线 } for(int j=1; j<=m; j++){ if(a[i][j] == 'F' and a[i-1][j] == 'F') h[i][j] = h[i-1][j] + 1;//延伸上悬线 } for(int j=m; j>=1; j--){ if(a[i][j] == 'F' and a[i][j+1] == 'F') r[i][j] = r[i][j+1];//延伸右悬线 } } for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++){ if(a[i][j] == 'F' and a[i-1][j] == 'F'){ l[i][j] = max(l[i][j], l[i-1][j]); r[i][j] = min(r[i][j], r[i-1][j]); } if(a[i][j] == 'F'){ ans = max(ans, h[i][j] * (r[i][j] - l[i][j] + 1)); } } } printf("%d", ans*3); return 0; }

__EOF__

本文作者w1210
本文链接https://www.cnblogs.com/w1210323/p/18027692.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   w1210  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示