Topic Link:
Http://uva.onlinejudge.org/index.php? option=com_onlinejudge&itemid=8&category=460&page=show_problem&problem=4076
Have done a one-dimensional, this problem has only become two-dimensional, the other methods are the same. HDU 1506 largest Rectangle in a histogram
Code 1:
#include <cstdio> #include <cstring> #include <stack> using Std::stack;
const int MAXN = 1010;
Char str[maxn*3];
int SUM[MAXN][MAXN];
int LEFT[MAXN], RIGHT[MAXN];
int n, m;
inline void input () {scanf ("%d%d%*c", &n, &m);
for (int i=1; i<=n; ++i) {for (int j=1; j<=m; ++j) {char ch = getchar ();
while (ch!= ' F ' && ch!= ' R ') Ch=getchar ();
SUM[I][J] = ch== ' R '? 0:1;
if (Sum[i][j]) sum[i][j] + = sum[i-1][j];
}} inline void Solve () {input ();
int ans = 0;
for (int i=1; i<=n; ++i) {sum[i][0] = sum[i][m+1] =-1;
for (int j=1; j<=m; ++j) left[j]=right[j]=j; for (int j=1; j<=m; ++j) {while (sum[i][j) <= sum[i][left[j]-1]) left[j] = Left[left[j
]-1]; for (int j=m; j>=1;--j) {while (SUM[I][J); = Sum[i][right[j]+1]) right[j] = right[right[j]+1];
int tmp = (right[j]-left[j]+1) *sum[i][j];
if (tmp > ans) ans=tmp;
} printf ("%d\n", ans*3);
int main () {int ncase;
scanf ("%d", &ncase);
while (ncase--) {solve ();
return 0; }
Code 2 (Stack scan):
#include <cstdio> #include <cstring> #include <stack> using Std::stack;
const int MAXN = 1010;
Char str[maxn*3];
int SUM[MAXN][MAXN];
int n, m;
inline void input () {scanf ("%d%d%*c", &n, &m);
memset (sum, 0, sizeof (sum));
for (int i=1; i<=n; ++i) {for (int j=1; j<=m; ++j) {char ch = getchar ();
while (ch!= ' F ' && ch!= ' R ') Ch=getchar ();
SUM[I][J] = ch== ' R '? 0:1;
if (Sum[i][j]) sum[i][j] + = sum[i-1][j];
}} inline void Solve () {input ();
int ans = 0;
for (int i=1; i<=n; ++i) {sum[i][0] = sum[i][m+1] =-1;
stack<int>q;
for (int j=1; j<=m+1; ++j) {if (Q.empty () | | sum[i][j]>sum[i][q.top ()]) {Q.push (j);
else if (Sum[i][j] < Sum[i][q.top ()) {int pos; while (!q.empty() && sum[i][q.top ()]>sum[i][j]) {int tmp = (j-q.top ()) *sum[i][q.top ()];
if (tmp > ans) ans = tmp;
pos = Q.top ();
Q.pop ();
} q.push (POS);
Sum[i][pos] = Sum[i][j];
} printf ("%d\n", ans*3);
int main () {int ncase;
scanf ("%d", &ncase);
while (ncase--) {solve ();
return 0; }
See more highlights of this column: http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/