poj3494 Largest Submatrix of All 1’s 单调栈+dp

题意:在一个m * n的0/1矩形找一个最大的全1矩形,求其面积。

思路:类似poj2794,只不过这题是二维的,但本质是一样的。设dp[i][j]记录从(i , j)向上最长连续的1的长度。预处理完

dp,我们将问题可以转化为依次求第i行为底,第j列高度为dp[i][j],求最大的矩形面积,完全是m次poj2794的做法罢了。详见

代码:

// file name: poj3494.cpp //
// author: kereo //
// create time:  2014年11月05日 星期三 20时32分35秒 //
//***********************************//
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int sigma_size=26;
const int MAXN=2000+100;
const double eps=1e-8;
const int inf=0x3fffffff;
const int mod=1000000000+7;
#define L(x) (x<<1)
#define R(x) (x<<1|1)
int m,n;
int l[MAXN],r[MAXN],dp[MAXN][MAXN];
struct node{
	int h,index;
}p[MAXN];
stacks;
int main()
{
	while(~scanf("%d%d",&m,&n)){
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				int x;
				scanf("%d",&x);
				if(x == 0)
					dp[i][j]=0;
				else 
					dp[i][j]=dp[i-1][j]+1;
			}
		}
		int ans=0;
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				p[j].index=j; p[j].h=dp[i][j];
				if(s.empty()){
					l[j]=r[j]=j;
					s.push(p[j]);
				}
				else{
					node temp=s.top();
					if(temp.h=p[j].h){
							node temp=s.top(); s.pop();
							index=temp.index;
							if(temp.h == p[j].h)
								r[index]=p[j].index;
							else 
								r[index]=p[j].index-1;
						}
						s.push(p[j]);
						l[j]=l[index]; r[j]=j;
					}
				}
			}
			int index=s.top().index;
			while(!s.empty()){
				node temp=s.top(); s.pop();
				int id=temp.index;
				r[id]=index;
			}
			for(int j=1;j<=n;j++)
				ans=max(ans,(r[j]-l[j]+1)*p[j].h);
		}
		printf("%d\n",ans);
	}
	return 0;
}


你可能感兴趣的:(单调栈,单调队列,单调栈)