HDU 1506 Largest Rectangle in a Histogram
2013-08-09 21:37
381 查看
思路:
对于每一块木板,Area=height[i]*(j-k+1) 其中,j<=x<=k,height[x]>=height[i];找j,k成为关键,一般方法肯定超时,
利用动态规划,如果它左边高度大于等于它本身,那么它左边的左边界一定满足这个性质,再从这个边界的左边迭代下去…
对于每一块木板,Area=height[i]*(j-k+1) 其中,j<=x<=k,height[x]>=height[i];找j,k成为关键,一般方法肯定超时,
利用动态规划,如果它左边高度大于等于它本身,那么它左边的左边界一定满足这个性质,再从这个边界的左边迭代下去…
#include <cstdio> #include <cstring> #include <cstdlib> __int64 n , l[100005] , num[100005] , r[100005]; void solve() { __int64 i , j; num[0] = num[n+1] = -1; for (i = 1 ; i <= n ; i++) { l[i] = i; while (num[l[i]-1] >= num[i]) l[i] = l[l[i]-1]; } for (i = n ; i > 0 ; i--) { r[i] = i; while (num[r[i]+1] >= num[i]) r[i] = r[r[i]+1]; } __int64 ans = 0; for (i = 1 ; i <= n ; i++) { __int64 tmp = num[i]*(r[i]-l[i]+1); if (tmp > ans)ans = tmp; } printf("%I64d\n",ans); } int main() { while (scanf("%I64d",&n) , n) { for (int i = 1 ; i <= n ; i++) scanf("%I64d",num+i); solve(); } // system("pause"); return 0; }
相关文章推荐
- hdu 1506 Largest Rectangle in a Histogram(求最大的矩形)
- hdu 1506(nyoj 258)Largest Rectangle in a Histogram(最大长方形(二))(单调栈)
- hdu 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram [好题]
- hdu 1506 Largest Rectangle in a Histogram(动态规划,很棒的优化)
- hdu 1506 Largest Rectangle in a Histogram
- HDU 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram
- HDU 1506 Largest Rectangle in a Histogram(最大矩形面积)
- HDU 1506 Largest Rectangle in a Histogram(DP)
- hdu 1506 Largest Rectangle in a Histogram【思维】
- HDU 1506 Largest Rectangle in a Histogram(DP)
- hdu 1506(nyoj 258)Largest Rectangle in a Histogram(最大长方形(二))(单调栈)
- HDU-1506 Largest Rectangle in a Histogram
- HDU 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram(单调栈)
- HDU - 1506 Largest Rectangle in a Histogram: 单调栈入门题
- hdu 1506 Largest Rectangle in a Histogram ((dp求最大子矩阵))