一种简单的dp思维 时间复杂度 O(nm)来解决符合条件的最大矩形
思路
用 up l r 三个数组记录任意(i,j) 点 能向 上 左 右 延申的最大长度
用此方式求出每一个极大矩形,在极大矩形中找出最大的哪一个 就是最大矩形
P1169 [ZJOI2007]棋盘制作 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
核心 code:
int n, m;
int mp[N][N];
int up[N], l[N][N], r[N][N];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
l[i][j] = 1;
if(j!=1&&mp[i][j]!=mp[i][j-1])
{
l[i][j] += l[i][j-1];
}
}
for (int i = 1; i <= n; i++)
for (int j = m; j >= 1; j--)
{
r[i][j] = 1;
if (j != m && mp[i][j] != mp[i][j + 1])
{
r[i][j] += r[i][j + 1];
}
}
int zheng =1,ju = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (i != 1 && mp[i - 1][j] != mp[i][j])
{
l[i][j] = min(l[i][j], l[i - 1][j]);
r[i][j] = min(r[i][j], r[i - 1][j]);
up[j] = up[j] + 1;
}
if (i == 1 || mp[i - 1][j] == mp[i][j])up[j] = 1;
zheng = max(zheng, min(l[i][j] + r[i][j] - 1, up[j]) * min(l[i][j] + r[i][j] - 1, up[j]));
ju = max(ju, up[j] * (l[i][j] + r[i][j] - 1));
}
}
存在的思路问题 :
当前情况下 算 红色区域 的点时候会把 红框矩形当作最大面积矩形
其实不会造成影响
因为在遍历蓝色区域的点时候 会重新算出黑色矩形为最大矩形