您的位置:首页 > 其它

HDU 1506 DP 动态规划思想

2015-08-10 20:10 363 查看
这个题有人用并查集A掉了,实在是服气。我是百度了之后,其实当时已经想到了思路,就差那临门一脚,然而卡了几个小时,最后还是看了别人的。惭愧惭愧,

说一下思路:之前的矩形是搜索最小的传送门,在此题中可以假定在这个状态时,这个矩形的高度已经是最小的,所以此处面积必定以他作为高度,那么我们只要向左搜索最高的

再记录下标,再向右寻找出最高的地方,并且记录下标。那么此时的面积必定为此状态的最大。可以用案例模拟。

<pre name="code" class="cpp">#include <iostream>
#include <cstring>
#include <cmath>
#define MAX 100010
using namespace std;
long long height[MAX];
long long  dp[MAX];
long long  l[MAX],r[MAX];
int main()
{
long long maxx;
long long  n;
long long i,j;
while(cin>>n&&n)
{

for(i = 1 ;i <= n ;i++)
{
cin>>height[i];
l[i]=r[i]=i;
}
//         height[0] = height[n+1] = -1;//初始化,因为是从1,n开始向左右搜寻,如果改成2,n-1则不必
for(i = 2 ;i <= n ;i++)
{
while(height[l[i]-1]>=height[i]&&l[i] > 0)//向左寻找最高下标,l[i]>0此处缺少会超时
{
l[i]=l[l[i]-1];//直接从刚才的最高点开始搜寻,可以跳过很多步骤,可以说是优化
}
}
for(i = n-1 ; i >= 1; i--)
{
while(height[i]<=height[r[i]+1]&&r[i] < n)//同上处,r[i] < n,此处缺少也会超时
{
r[i]=r[r[i]+1];
}
}
maxx = -999999;//面积初始化
for(i = 1 ;i <= n ; i++)
{
if((r[i]-l[i]+1)*height[i]>maxx)//对每个面积进行比较,找出最大的
{
maxx=(r[i]-l[i]+1)*height[i];
}
}
cout<<maxx<<endl;
}
return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: