【寒假的尾巴】HDU1506(dp)

问题描述:给你一个直方图,给出各个矩形的高度,计算在公共基线上对齐的柱状图中最大矩形的面积。

问题分析:利用动态规划的方法,对于位置i,如果左边条形矩形的高度大于它本身,那么左边的左边界一定也满足位置i的左边界。同理如果右边条形矩形的高度大于它本身,那么右边的右边界也一定满足位置i的右边界。迭代循环下去。直到找到i的左右边界。

#include<iostream>
using namespace std;
const int maxn = 100010;
typedef long long ll;
ll s[maxn];
//ll dp[maxn];
int l[maxn], r[maxn];
int n;

int main()
{
	while (cin >> n && n)
	{
		for (int i = 1; i <= n; i++)
		{
			cin >> s[i];
			l[i] = r[i] = i;
		}
		l[0] = 1;
		r[n + 1] = n ;
		s[0] = -1;
		s[n + 1] = -1;
		for (int i = 1; i <= n; i++)
		{
			
			while ( s[l[i] - 1] >= s[i])//想了半天,这样做可以大大缩短时间,不用一个个比较
			{
				l[i] = l[l[i] - 1];
			}
		}
		for (int i = n; i >= 1; i--)//反方向过来也是同样
		{
			
			while ( s[r[i] + 1] >= s[i])
			{
				r[i] = r[r[i] + 1];
			}
		}
		ll max = 0;
		for (int i = 1; i <= n; i++)
		{
			if (s[i] * (r[i] - l[i] + 1) > max)
				max = s[i] * (r[i] - l[i] + 1);
		}
		cout << max << endl;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值