給定一個 \(N * M\) 的矩陣
求最大的全爲 \(F\) 的子矩陣ios
懸線法
限制條件爲轉移來的和如今的都爲 \(F\)spa
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> #include<climits> #define LL long long #define REP(i, x, y) for(int i = (x);i <= (y);i++) using namespace std; int RD(){ int out = 0,flag = 1;char c = getchar(); while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();} while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();} return flag * out; } const int maxn = 2019; int lenx, leny; int map[maxn][maxn]; int l[maxn][maxn], r[maxn][maxn]; int up[maxn][maxn]; int ans; void init(){ lenx = RD(), leny = RD(); REP(i, 1, lenx)REP(j, 1, leny){ char s[19]; scanf("%s", s); if(s[0] == 'F'){ map[i][j] = 1; l[i][j] = r[i][j] = j; up[i][j] = 1; } } REP(i, 1, lenx)REP(j, 2, leny){ if(map[i][j] && map[i][j - 1])l[i][j] = l[i][j - 1]; } REP(i, 1, lenx)for(int j = leny - 1;j >= 1;j--){ if(map[i][j] && map[i][j + 1])r[i][j] = r[i][j + 1]; } } void solve(){ REP(i, 1, lenx)REP(j, 1, leny){ if(!map[i][j])continue; if(i > 1 && map[i - 1][j]){ l[i][j] = max(l[i][j], l[i - 1][j]); r[i][j] = min(r[i][j], r[i - 1][j]); up[i][j] = up[i - 1][j] + 1; } int a = r[i][j] - l[i][j] + 1; ans = max(ans, a * up[i][j]); } printf("%d\n", ans * 3); } int main(){ init(); solve(); return 0; }