HDU 2870 Largest Submatrix

时间:2023-03-09 15:20:18
HDU 2870 Largest Submatrix

这三道题的关系是这样的,1505是1506的加强版,2870又是1505的加强版

如果按照上面由简到易的顺序来做的话,还是很简单的

这道题的思想就是 枚举+DP

因为某些字符可以变值,所以我们枚举a, b, c三个矩阵

分别求出对应的h数组以及最大子矩阵,再在里面求出一个最大值即可。

 //#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = ;
char map[maxn][maxn];
int h[][maxn], l[][maxn], r[][maxn]; int main(void)
{
#ifdef LOCAL
freopen("2870in.txt", "r", stdin);
#endif int row, col;
while(scanf("%d%d", &row, &col) == )
{
int i, j, k, t;
for(i = ; i < row; ++i)
scanf("%s", map[i]);
memset(h, , sizeof(h));
int ans = ;
for(i = ; i < row; ++i)
{
for(j = ; j < col; ++j)
{
switch(map[i][j])
{ //处理h数组
case 'a':
++h[][j], h[][j] = h[][j] = ;
break;
case 'b':
++h[][j], h[][j] = h[][j] = ;
break;
case 'c':
++h[][j], h[][j] = h[][j] = ;
break;
case 'w':
++h[][j], ++h[][j], h[][j] = ;
break;
case 'x':
++h[][j], ++h[][j], h[][j] = ;
break;
case 'y':
++h[][j], ++h[][j], h[][j] = ;
break;
case 'z':
++h[][j]; ++h[][j], ++h[][j];
}
}
l[][] = l[][] = l[][] = ;
r[][col-] = r[][col-] = r[][col-] = col-;
for(j = ; j < col; ++j)
for(k = ; k < ; ++k)
{
t = j;
while(t > && h[k][j] <= h[k][t-])
t = l[k][t-];
l[k][j] = t;
} for(j = col-; j >= ; --j)
for(k = ; k < ; ++k)
{
t = j;
while(t < col- && h[k][j] <= h[k][t+])
t = r[k][t+];
r[k][j] = t;
} for(j = ; j < col; ++j)
for(k = ; k < ; ++k)
ans = max(ans, (r[k][j]-l[k][j]+)*h[k][j]);
}
printf("%d\n", ans);
}
return ;
}

代码君