http://acm.hdu.edu.cn/showproblem.php?pid=1506
题意:求柱状图上的小矩形可以形成的最大面积。
思路:对于每个小矩形,求以当前小矩形为最低点能够向左右延伸的最长距离。用dp1[]和dp2[]分别表示左边和右边能够延伸到的端点的左边。
状态转移方程: if(a[i] > a[i-1])dp1[i] = i-1;else { while(t >= 1 && a[t] >= a[i]) t = dp1[t] ; dp1[i] = t}。右边类似。不过切记dp1【】记录的左端点-1,dp2【】记录的右端点+1。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; __int64 a[100010]; __int64 dp1[100010],dp2[100010]; int n; int main() { while(~scanf("%d",&n) && n) { memset(dp1,0,sizeof(dp1)); memset(dp2,0,sizeof(dp2)); memset(a,-1,sizeof(a)); for(int i = 1; i <= n; i++) scanf("%I64d",&a[i]); dp1[1] = 0; int t; for(int i = 2; i <= n; i++) { if(a[i] > a[i-1]) dp1[i] = i-1; else { t = i-1; while(a[t] >= a[i] && t >= 1) { t = dp1[t]; } dp1[i] = t; } } dp2[n] = n+1; for(int i = n-1; i >= 1; i--) { if(a[i] > a[i+1]) dp2[i] = i+1; else { t = i+1; while(a[t] >= a[i] && t <= n) { t = dp2[t]; } dp2[i] = t; } } __int64 ans = -1,res; for(int i = 1; i <= n; i++) { res = (dp2[i]-dp1[i]-1)*a[i]; ans = max(ans,res); } printf("%I64d\n",ans); } return 0; }
hdu 1506 Largest Rectangle in a Histogram,布布扣,bubuko.com
hdu 1506 Largest Rectangle in a Histogram
原文:http://blog.csdn.net/u013081425/article/details/19992251