HDU 1069 Monkey and Banana

一时失言乱红尘 2022-04-16 05:53 257阅读 0赞

原题目链接:HDU1069


分类

HDU 动态规划 贪心


题意

题意是堆箱子、要求上面的箱子的长和宽都小于下面箱子的长和宽


想法

因为每块砖有三种摆法(高和底面积不同),可以把这三种情况当成不同的三块砖,加入brick数组中。注意,一定要分清长和宽,长要比宽长,这样在后面dp的过程中可以保证长边和长边比较、短边和短边比较。
所以

  1. 要么保证长比宽长,每次录入3个面
  2. 要么每次录入6个面
    因为这个卡了好久

代码

15ms

  1. /** * Author: GatesMa * Email: gatesma@foxmail.com * Todo: ACM Training * Date:2018/11/17 */
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. int dp[2000];
  5. struct node{
  6. int l, w, h;
  7. }brick[2000];
  8. bool cmp(node a, node b)
  9. {
  10. if(a.l != b.l){
  11. return a.l > b.l;
  12. }else{
  13. return a.w > b.w;
  14. }
  15. }
  16. int main()
  17. {
  18. int n;
  19. int tmp[3], ans, k;
  20. int kase = 0;
  21. while(scanf("%d",&n)!=EOF){
  22. if(n ==0){
  23. return 0;
  24. }
  25. k = 0;
  26. for(int i =0;i < n;i++){
  27. scanf("%d%d%d",&tmp[0],&tmp[1],&tmp[2]);
  28. sort(tmp,tmp+3);
  29. brick[k].l=tmp[0];
  30. brick[k].w=tmp[1];
  31. brick[k++].h=tmp[2];
  32. brick[k].l=tmp[1];
  33. brick[k].w=tmp[2];
  34. brick[k++].h=tmp[0];
  35. brick[k].l=tmp[0];
  36. brick[k].w=tmp[2];
  37. brick[k++].h=tmp[1];
  38. }
  39. sort(brick, brick + k, cmp);
  40. ans = -1;
  41. for(int i = 0;i < k;i++){ //遍历所有砖块
  42. dp[i] = brick[i].h;//dp[i]代表以第i块砖为顶的塔的最大高度
  43. //初始值是i砖块的高度(最坏的情况就是塔只有i一块砖)
  44. for(int j= i-1;j >=0; j--){ //开始决定i砖块底下的砖是什么
  45. if(brick[j].l > brick[i].l && brick[j].w > brick[i].w){ //如果j砖块符合条件
  46. dp[i] = max(dp[i], dp[j] + brick[i].h);
  47. //放在以j砖块为顶的塔上是否比原来的值大
  48. }
  49. }
  50. ans = max(ans, dp[i]);//答案是所有dp中的最大值
  51. }
  52. printf("Case %d: maximum height = %d\n",++kase,ans);
  53. }
  54. }

发表评论

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

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

相关阅读