当前位置: 首页 > news >正文

题解:P10965 Largest Submatrix - e

题目链接

https://www.luogu.com.cn/problem/P10965

分析

和 P4147 玉蟾宫 一题很像。

易于想到,给定矩阵最大的全部元素都相同的子矩阵的元素个数最多时,矩阵中一定只存在 abc。分别处理使 abc 数量最多时的情况。

那么对于矩阵中的每一个位置,可以分别求出从当前位置向上全为相同字母的最大高度,记为 \(maxheight_i\)。处理完一行的高度后,还可以用单调栈求出每个位置左侧和右侧第一个高度小于当前高度的位置,记作 \(posl_i, posr_i\)

那么就可以形成从 \(posl_i + 1\)\(posr_i - 1\),高度为 \(maxheight_i\) 的矩阵,即贡献为 \((posr_i - posl_i + 1) \times maxheight_i\)

在所有位置的贡献中取最大值即为答案。

细节内容见代码注释。

Code

#include <bits/stdc++.h>using namespace std;constexpr int N = 1005;
int n, m, pos_l[N], pos_r[N], max_ht[N][N][3]; char mp[N][N];deque<int> que;int main()
{
//	freopen(".in", "r", stdin), freopen(".out", "w", stdout);ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);for (; cin >> n >> m; ){for (int i = 1; i <= n; ++ i) cin >> mp[i] + 1;memset(max_ht, 0, sizeof max_ht); // 多测清空for (int i = 1; i <= n; ++ i) for (int j = 1; j <= m; ++ j) switch(mp[i][j]){// 分别处理每种情况,'a' -> 0,'b' -> 1,'c' -> 2case 'a': { max_ht[i][j][0] = 1 + max_ht[i - 1][j][0]; break; }case 'b': { max_ht[i][j][1] = 1 + max_ht[i - 1][j][1]; break; }case 'c': { max_ht[i][j][2] = 1 + max_ht[i - 1][j][2]; break; }case 'w': { max_ht[i][j][0] = 1 + max_ht[i - 1][j][0], max_ht[i][j][1] = 1 + max_ht[i - 1][j][1]; break; }case 'x': { max_ht[i][j][1] = 1 + max_ht[i - 1][j][1], max_ht[i][j][2] = 1 + max_ht[i - 1][j][2]; break; }case 'y': { max_ht[i][j][0] = 1 + max_ht[i - 1][j][0], max_ht[i][j][2] = 1 + max_ht[i - 1][j][2]; break; }case 'z': { max_ht[i][j][0] = 1 + max_ht[i - 1][j][0], max_ht[i][j][1] = 1 + max_ht[i - 1][j][1], max_ht[i][j][2] = 1 + max_ht[i - 1][j][2]; break; }}int ans = 0;for (int num = 0; num < 3; ++ num) for (int i = 1; i <= n; ++ i){// 单调栈处理右侧max_ht[i][m + 1][num] = -1;for (int j = 1; j <= m + 1; ++ j){for (; !que.empty() && max_ht[i][j][num] < max_ht[i][que.back()][num]; pos_r[que.back()] = j, que.pop_back());que.push_back(j);}// 单调栈处理左侧max_ht[i][0][num] = -1;for (int j = m; 0 <= j; -- j){for (; !que.empty() && max_ht[i][j][num] < max_ht[i][que.back()][num]; pos_l[que.back()] = j, que.pop_back());que.push_back(j);}// 计算贡献for (int j = 1; j <= m; ++ j) ans = max(ans, max_ht[i][j][num] * (pos_r[j] - pos_l[j] - 1));}cout << ans << '\n';}return 0;
}
http://www.aitangshan.cn/news/835.html

相关文章:

  • 面试防坑场景
  • 夜莺开源监控,模板函数一览
  • 10 个不错的 C 语言开源项目
  • systemctl服务管理
  • 打编程之024:免费本地AI客户端-Chatbox和CherryStudio
  • 绩效考核管理系统横评:功能对比、应用场景与企业选择指南
  • Windows10 安装编译后的 pysqlcipher3-v1.2.1 基于 Python 3.11.9
  • SEATA AT vs SAGA vs 本地消息表
  • Moka远程招聘系统:2025年AI视频面试+电子签零接触入职标准方案
  • 个性化联邦学习库PFLlib的技术解析与基准测试
  • 回归whk
  • DNS服务器漏洞可能导致远程代码执行
  • (自适应手机端)烘干机网站模板 通用机械设备网站源码下载
  • Oracle RAC 19.8 RHEL7.6 安装手册
  • AutoCAD Plant 3D 安装步骤与新手入门教程
  • 技术岗位学习路径指南 - 详解
  • 状态机的设计流程
  • (自适应手机端)消防设备网站pbootcms模板
  • 金仓数据库物理备份还原
  • (自适应手机端)导航网站模板 网站目录源码下载
  • (自适应手机端)网址发布页pbootcms网站模板
  • 7.2.1 十二重计数法
  • (自适应手机端)驾校网站模板 驾照考证网站源码下载
  • 让sql service 只有只读权限
  • 【小白学算法】IDA*搜索算法超详细解析+例题[洛谷]P2324 [SCOI2005] 骑士精神
  • MyEMS开源能源管理系统:双碳时代的能源革命引擎
  • 儿童饮食
  • (PC+WAP)油漆涂料网站模板 家装网站源码下载
  • 开源能源管理系统应用前景:以 MyEMS 为例
  • 国产化Word处理控件Spire.Doc教程:如何用 Python 统计 Word 文档中的词频