hdu 1506 Largest Rectangle in a Histogram

本文介绍了一种改进的动态规划方法,用于解决给定数组中最大矩形面积的问题。通过寻找每个元素左侧和右侧的高度边界下标,避免了传统的双重循环遍历,将时间复杂度从O(n^2)降低到了O(n)。该方法适用于编程竞赛和技术面试中的类似问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说是动态规划的题,但是说实话我没看出来

我的做法是找出当前位置左侧比a[i]高的个数l[i]和右侧比a[i]高的个数r[i]

二重循环,因为n最大为1e5,因此O(n*n)超时

看了别人的代码,虽然想法一样,但是找的不是两侧比当前高度高的个数,而是边界下标

比如第i个位置左侧比a[i]高度高的边界下标是l[i]==j,那么寻找第i+1个位置的左侧高度下标边界时

若a[i]>=a[i+1],那么直接判断a[l[i]]和a[i+1],因为j到i之间的高度都比a[i]高,因此必然比a[i+1]高

代码如下:

#include <iostream>
#include <cstdio>
#define ll long long
#define MAXN 100010
using namespace std;
ll a[MAXN];
ll l[MAXN];
ll r[MAXN];
int main(void){
	int n;
	int t;
	while(cin >> n, n){
		for(int i=1; i<=n; ++i){
			scanf("%d", &a[i]);
		}
		l[1] = 1;
		r[n] = n;
		for(int i=2; i<=n; ++i){
			t = i;
			while(t>1 && a[i]<=a[t-1]){
				t = l[t-1];
			}
			l[i] = t;
//			cout << "l[" << i << "] = " << l[i] << endl;
		}
		for(int i=n-1; i>0; --i){
			t = i;
			while(t<n && a[i]<=a[t+1]){
				t = r[t+1];
			}
			r[i] = t;
//			cout << "r[" << i << "] = " << r[i] << endl; 
		}
		ll maxdp = 0;
		for(int i=1; i<=n; ++i){
			maxdp = max(maxdp, (r[i]-l[i]+1)*a[i]);
		}
		cout << maxdp << endl;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值