!-- Loading 底层遮罩 -->

P4147 玉蟾宫

传送门

思路

悬线法:一种求解给定矩阵中的极大矩阵的算法。通过三个数组来逐行计算可能的矩形面积以求解出最大子矩形。该方法适用于地图小,障碍点多的问题。

典型的悬线法求解最大矩形。定义左移,右移,悬线三个数组,初始化和预处理左移和右移数组,遍历整个矩阵的过程中更新三个数组的值,同时求解每个位置的最大矩形面积并更新答案。 

 代码

#include<iostream> #define MAXN 1010 using namespace std; char mari[MAXN][MAXN]; int hi[MAXN][MAXN], le[MAXN][MAXN], ri[MAXN][MAXN], ans; int main(void) { int N = 0, C = 0; cin>>N>>C; for (int i = 1; i <= N; i++) { for (int j = 1; j <= C; j++) { cin >> mari[i][j]; hi[i][j] = 1; ri[i][j] = le[i][j] = j; } for (int j = 2; j <= C; j++) { if (mari[i][j]=='F'&& mari[i][j - 1] == 'F') le[i][j] = le[i][j - 1]; } for (int j = C - 1; j >= 1; j--) { if (mari[i][j]=='F'&& mari[i][j + 1] == 'F') ri[i][j] = ri[i][j + 1]; } } for (int i = 1; i <= N; i++) { for (int j = 1; j <= C; j++) { if (mari[i][j] == 'F') { if (i>1&&mari[i - 1][j] == 'F') { hi[i][j] = hi[i - 1][j] + 1; if (le[i - 1][j] > le[i][j]) le[i][j] = le[i - 1][j]; if (ri[i - 1][j] < ri[i][j]) ri[i][j] = ri[i - 1][j]; } if ((ri[i][j] - le[i][j] + 1) * hi[i][j] > ans) ans = (ri[i][j] - le[i][j] + 1) * hi[i][j]; } } } cout << 3 * ans; return 0; }

 


__EOF__

本文作者星晴
本文链接https://www.cnblogs.com/xqk0225/p/16079109.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Thinker-X  阅读(25)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示