hdu 1506 dp思想的应用
2012-08-24 20:36
393 查看
我们要求最大矩形面积,那么我们应该求每个矩形向两边延伸的最大长度,最坏情况为0(n),必然TLE,那么我们可以应该DP的思想,用一个数组来保存一些结果。
例如,dpl【i】表示从左边过来的最长,那么我们计算dpl【i】的时候,如果左边的比自己高,那么dpl【i】=dpl【i-1】,但是可能在前面还有更多符合情况的(比i-1低但是比i高),所以我们要用i-1-dp【i-1】,继续寻找,详情看代码
例如,dpl【i】表示从左边过来的最长,那么我们计算dpl【i】的时候,如果左边的比自己高,那么dpl【i】=dpl【i-1】,但是可能在前面还有更多符合情况的(比i-1低但是比i高),所以我们要用i-1-dp【i-1】,继续寻找,详情看代码
#include<iostream> #include<string.h> #define LL long long using namespace std; const int maxn=100010; int dpl[maxn],dpr[maxn]; LL height[maxn]; int main() { LL ans; int i,j,n; while(scanf("%d",&n)&&n) { for(i=1;i<=n;i++) { scanf("%d",&height[i]); dpl[i]=dpr[i]=1; } for(i=2;i<=n;i++) { int s=i-1; while(height[i]<=height[s]&&s>=1) { dpl[i]+=dpl[s]; s=s-dpl[s];//继续寻找 } } for(i=n-1;i>=1;i--) { int s=i+1; while(height[i]<=height[s]&&s<=n) { dpr[i]+=dpr[s]; s=s+dpr[s]; } } ans=0; for(i=1;i<=n;i++) { LL temp=(height[i]*(dpl[i]+dpr[i]-1)); if(ans<temp) ans=temp; } cout<<ans<<endl; } return 0; }
相关文章推荐
- hdu 1506 dp思想的应用
- HDU 1506 单调栈 (dp思想)
- HDU 1506 Largest Rectangle in a Histogram 迭代思想应用
- HDU 1506 DP 动态规划思想
- hdu 1506 Largest Rectangle in a Histogram (dp思想)
- POJ 1506 Largest Rectangle in a Histogram (dp的思想)
- hdu 1506 Largest Rectangle in a Histogram ((dp求最大子矩阵))
- HDU 1506 Largest Rectangle in a Histogram (dp左右处理边界的矩形问题)
- 【HDU 1058 & HDU 3199 类似丑数】 简单DP思想
- HDU 1506 Largest Rectangle in a Histogram (线性dp)
- HDU 4632 多校四-1001(DP的应用)
- HDU 1506 && HDU1505 && HDU 2870 (DP).
- HDU 1506 Largest Rectangle in a Histogram(DP)
- hdu - 1506 - Largest Rectangle in a Histogram(dp / 单调栈)
- hdu1506 Largest Rectangle in a Histogram(DP)
- HDU 5280 Senior's Array(DP思想 暴力)
- NYOJ-258/POJ-2559/HDU-1506 Largest Rectangle in a Histogram,最大长方形,dp或者单调队列!
- HDU-1506-Largest Rectangle in a Histogram【思维】【dp】【好题】
- HDU 1227 dp距离和最小,中位数的应用
- hdu 4612 Warm up 双连通+树形dp思想