P1191 矩形(dp&单调栈)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1191 矩形(dp&单调栈)相关的知识,希望对你有一定的参考价值。

P1191 矩形(dp&单调栈)

考虑计算每个位置作为矩形左下角的贡献。

先预处理出每个位置向上最高延长的高度 b ( i , j ) b(i,j) b(i,j)

然后我们遍历列的时候从右往左遍历,显然 ≥ b ( i , j ) \\ge b(i,j) b(i,j) 的列都可以满足,我们用单调栈维护向右第一个小于 b ( i , j ) b(i,j) b(i,j) 的位置 p o s pos pos

然后我们再开一个数组 d p ( i , j ) dp(i,j) dp(i,j) 表示它的贡献。

这样有递推式: d p ( i , j ) = b ( i , j ) × ( p o s − j ) + d p ( i , p o s ) dp(i,j) = b(i,j)\\times(pos-j)+dp(i,pos) dp(i,j)=b(i,j)×(posj)+dp(i,pos)

时间复杂度: O ( n 2 ) O(n^2) O(n2)

// Problem: P1191 矩形
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1191
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2022-02-02 16:16:54
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=155,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr) 
void Print(int *a,int n)
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 

template <typename T>		//x=max(x,y)  x=min(x,y)
void cmx(T &x,T y)
	if(x<y) x=y;

template <typename T>
void cmn(T &x,T y)
	if(x>y) x=y;

char a[N][N];
int b[N][N];
int dp[N][N];
int n,ans;
int s[N],tp;
int main()
	scanf("%d",&n);
	for(int i=0;i<n;i++) scanf("%s",a[i]);
	for(int i=n-1;~i;i--)
		for(int j=0;j<n;j++)
			if(a[i][j]=='W')
				b[i][j]+=b[i+1][j]+1;
			
		
	s[0] = n;
	for(int i=0;i<n;i++)
		tp = 0;
		for(int j=n-1;~j;j--)
			while(tp && b[i][s[tp]]>b[i][j]) tp--;
			dp[i][j] =b[i][j] * (s[tp]-j) + dp[i][s[tp]];
			ans+=dp[i][j];
			s[++tp] = j;
		
	
	printf("%d\\n",ans);
	return 0;

以上是关于P1191 矩形(dp&单调栈)的主要内容,如果未能解决你的问题,请参考以下文章

7.14 单调栈 单调队列 +dp优化

leetcode 每日一题 85. 最大矩形

51nod 1102 面积最大的矩形 && 新疆大学OJ 1387: B.HUAWEI's billboard 单调栈+拼凑段(o(n) 或 o(nlog(n))

HDU -1506 Largest Rectangle in a Histogram&&51nod 1158 全是1的最大子矩阵 (单调栈)

hdu 1506 单调栈问题

单调队列&单调栈归纳