其实就是分行分颜色的分别做一遍1506的dp
不懂的可以看下1506题解
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 1007
using namespace std;
int n,m;
int h[4][MAX];
int rig[4][MAX];
int lef[4][MAX];
int main ( )
{
while ( ~scanf ( "%d%d" , &n , &m ) )
{
char s[MAX];
int ans = 0;
memset ( h , 0 , sizeof ( h ) );
for ( int i = 1 ; i <= n ; i++ )
{
scanf ( "%s" , s+1 );
for ( int j = 1 ; j <= m ; j++ )
if ( s[j] == 'w' )
{
h[1][j]++;
h[2][j]++;
h[3][j]=0;
}
else if ( s[j] == 'x' )
{
h[1][j]=0;
h[2][j]++;
h[3][j]++;
}
else if ( s[j] == 'y' )
{
h[1][j]++;
h[2][j]=0;
h[3][j]++;
}
else if ( s[j] == 'z' )
{
h[1][j]++;
h[2][j]++;
h[3][j]++;
}
else if ( s[j] == 'a' )
{
h[1][j]++;
h[2][j] = h[3][j] = 0;
}
else if ( s[j] == 'b' )
{
h[2][j]++;
h[1][j] = h[3][j] = 0;
}
else if ( s[j] == 'c' )
{
h[3][j]++;
h[1][j] = h[2][j] = 0;
}
for ( int k = 1 ; k < 4 ; k++ )
for ( int j = 1 ; j <= m ; j++ )
rig[k][j] = lef[k][j] = j;
for ( int k =1 ; k < 4 ; k++ )
for ( int j = 2 ; j <= m ; j++ )
while ( lef[k][j] > 1 && h[k][lef[k][j]-1] >= h[k][j] )
lef[k][j] = lef[k][lef[k][j]-1];
for ( int k =1 ; k < 4 ; k++ )
for ( int j = m-1 ; j >= 1 ; j-- )
while ( rig[k][j] < m && h[k][rig[k][j]+1] >= h[k][j] )
rig[k][j] = rig[k][rig[k][j]+1];
for ( int j = 1 ; j <= m ; j++ )
for ( int k = 1 ; k < 4 ; k++ )
ans = max ( ans , h[k][j]*(rig[k][j]-lef[k][j]+1) );
}
printf ( "%d\n" , ans );
}
}