题目:http://poj.org/problem?id=3494
分析:相当于是最大直方和的二维版,对于最大直方和问题,我们对每个点找到最左边大于等于它的位置和最右边大于等于它的位置,用一个单调栈可以在O(N)空间O(N)时间内完成,对于本题,我们即分别将每一行作为直方图的X轴,所以时间上是O(MN),空间上仍需O(N)辅助
#include <cstdio>
#define MAX 2005
inline int max(int a, int b){ return a > b ? a : b; }
int M, N, a[MAX][MAX], ans;
int l[MAX], st[MAX], top;
void floor(int f)
{
l[0] = 1;
top = 0;
st[++top] = 0;
for(int i = 1; i < N; ++i){
while(top && a[f][st[top]] >= a[f][i]) --top;
if(top) l[i] = i - st[top];
else l