码迷,mamicode.com
首页 > 其他好文 > 详细

[2016-03-30][HDU][1069][Monkey and Banana]

时间:2016-04-01 23:26:28      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

  • 时间:2016-03-27 15:19:40 星期日

  • 题目编号:[2016-03-30][HDU][1069][Monkey and Banana]

  • 题目大意:给定n种积木无限个,问这些积木最大能叠多高,上面的积木长宽必须严格小于下面的积木

  • 分析:

    • dp[i]表示第i个积木在顶部时候的最大高度,那么dp[i] = max(dp[i],dp[j] + h[i]);?jij
    • 初始条件就是长宽最大的高度是它自己,
  1. #include <algorithm>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. typedef long long LL;
  6. int dp[90*90];
  7. struct mRect{
  8. int x,y,z;
  9. mRect(int a = 0,int b = 0,int c = 0):x(a),y(b),z(c){};
  10. bool operator < (const mRect & a)const{
  11. return x > a.x || (x == a.x && y > a.y) || (x == a.x && y == a.y && z > a.z);
  12. }
  13. bool operator == (const mRect & a)const{
  14. return x == a.x && y == a.y && z == a.z;
  15. }
  16. }r[90 * 90];
  17. int main(){
  18. int n,cntcase = 0;
  19. while(~scanf("%d",&n) && n){
  20. int a[3],cur = 1;
  21. for(int i = 0 ;i < n ; ++i){
  22. for(int j = 0;j < 3 ;++j) scanf("%d",&a[j]);
  23. sort(a,a+3);
  24. r[cur++] = mRect(a[0],a[1],a[2]);
  25. r[cur++] = mRect(a[0],a[2],a[1]);
  26. r[cur++] = mRect(a[1],a[2],a[0]);
  27. }
  28. sort(r+1,r+cur);
  29. cur = unique(r+1,r+cur) - r;
  30. memset(dp,0,sizeof(dp));
  31. r[0] = mRect(0x3f3f3f3f,0x3f3f3f3f,0);
  32. int maxh = 0;
  33. for(int i = 1;i < cur;++i){
  34. for(int j = 0;j < i;++j){
  35. if(r[i].x < r[j].x && r[i].y < r[j].y){
  36. dp[i] = max(dp[i],dp[j] + r[i].z);
  37. }
  38. }
  39. maxh = max(maxh,dp[i]);
  40. }
  41. printf("Case %d: maximum height = %d\n",++cntcase,maxh);
  42. }
  43. return 0;
  44. }




[2016-03-30][HDU][1069][Monkey and Banana]

标签:

原文地址:http://www.cnblogs.com/qhy285571052/p/4cf945a699f5de1d1c250acfd2a29dc6.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!