HDU 1506 Largest Rectangle in a Histogram

ゞ 浴缸里的玫瑰 2022-04-16 04:21 229阅读 0赞

原题目链接HDU1506


分类

HDU 动态规划


题意

给你一个直方图,告诉你各个条形矩形的高度,求基线对齐构成的矩形中面积
最大的矩形的面积对于每一个矩形。

样例输入输出

Sample Input

  1. 7 2 1 4 5 1 3 3
  2. 4 1000 1000 1000 1000
  3. 0

Sample Output

  1. 8
  2. 4000

想法

对于每一个a[i],用dp找出a[i]左边和右边连续大于自己的数的长度
l[i]表示比a[i]大的数连续的最左边的位置
r[i]表示比a[i]大的数连续的最右边的位置


代码

106ms

  1. #include<stdio.h>
  2. #include<string.h>
  3. int l[100010],r[100010];
  4. __int64 h[100010];
  5. int main()
  6. {
  7. int N;
  8. while(~scanf("%d",&N) && N!=0)
  9. {
  10. memset(h,0,sizeof(h));
  11. for(int i = 1; i <= N; i++)
  12. {
  13. scanf("%I64d",&h[i]);
  14. l[i] = r[i] = i;
  15. }
  16. l[0] = 1;
  17. r[N+1] = N;
  18. h[0] = -1;
  19. h[N+1] = -1;
  20. //这上边不加就会超时,不加的话下边就可能一直while,跳不出循环
  21. for(int i = 1; i <= N; i++)
  22. {
  23. while(h[l[i]-1] >= h[i])//找位置i的左边界
  24. l[i] = l[l[i]-1];
  25. }
  26. for(int i = N; i >= 1; i--)
  27. {
  28. while(h[r[i]+1] >= h[i])//找位置i的右边界
  29. r[i] = r[r[i]+1];
  30. }
  31. __int64 MaxArea = -0xffffff0;
  32. for(int i = 1; i <= N; i++)
  33. {
  34. if(h[i]*(r[i]-l[i]+1) > MaxArea)
  35. MaxArea = h[i]*(r[i]-l[i]+1);
  36. }
  37. printf("%I64d\n",MaxArea);
  38. }
  39. return 0;
  40. }

发表评论

表情:
评论列表 (有 0 条评论,229人围观)

还没有评论,来说两句吧...

相关阅读