正文

猴子吃桃(DP)2007-07-01 11:53:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/27257.html

分享到:

问题描述:
有一班科学家正在设计一个测试猴子IQ的试验。他们 把一只“banana”吊在天花板,而且同时给猴子一些箱子。如果猴子聪明的话,它们会把箱子一个个叠起来做成一个塔子来取得食物。科学家有n种箱子,而且每一种箱子都有好多个。第 i 种箱子有三维(xi,yi,zi)。箱子可以用它的任意一面作底面来摆放,也就是它的三维之中可以任选两条来做它的底面长和宽。科学家想确定箱子叠到最高的时候是可以到达天花板的。现在问题是,要叠起一个塔子,上下摆放的两个箱子,在上的箱子的底面长宽必须严格小于在下的箱子的底面长宽,留下些地方让猴子落脚来爬上去。也就是说,底面面积相等的箱子不能叠放。现在你的任务是利用所给定的箱子,决定塔子最高能达到的高度

输入:
输入数据有多组测试数据。
每一组测试数据的第一行是一个整数n,表示不同三维的箱子的总数。n最大为30。
以下的n行每一行有三个正整数,表示该箱子的三维xi,yi和zi。
当n=0的时候输入结束。

输出:
对应每组测试数据,输出一行包括数据组号case(从1开始)和塔子最高高度height,
并按照一下格式: "Case case: maximum height = height"

样例输入
1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0

样例输出
Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342

// DP

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 32
#define SWAP(a,t,b) { t=a; a=b; b=t; }

typedef struct node{
 int length;
 int width;
 int height;
 int value;
}NODE;

void deal(int *a,int *b,int *c){
 int t;
 if(*a > *b)
  SWAP(*a,t,*b);
 if(*a > *c)
  SWAP(*a,t,*c);
 if(*b > *c)
  SWAP(*b,t,*c);
}

void copy(int a,int b,int c,NODE *p){
 p->length = a;
 p->width = b;
 p->value = p->height = c;
}

int myCmp(const NODE *a,const NODE *b){
 if(a->length>b->length||(a->length==b->length && a->width>b->width))
  return 1;
 if(a->length==b->length && a->width==b->width)
  return 0;
 return -1;
}

void get(int *rlt, NODE *d, int i, int j){
 int m,r,max;
 for(m=0,max=0; m < i; m++){
  if(d[i].length>d[m].length&&d[i].width>d[m].width&&d[m].value>max){
   r = m;
   max = d[m].value;
  }
 }
 d[i].value += max;
 *rlt = (*rlt > d[i].value ? *rlt : d[i].value);
}

int main(){
 int  rlt,i,j,a,b,c,n,m=0;
 NODE d[MAX*3];
 for(m=1; scanf("%d",&n)!=EOF && n; m++){
  memset(d,0,sizeof(NODE)*MAX*3);
  for(j=i=0; i < n; i++){
   scanf("%d %d %d",&a,&b,&c);
   deal(&a,&b,&c);
   copy(a,b,c,&d[j++]);
   if(b != c)
    copy(a,c,b,&d[j++]);
   if(a != b)
    copy(b,c,a,&d[j++]);
  }
  qsort(d,j,sizeof(NODE),myCmp);
  for(rlt=d[0].value,i=1; i < j; i++)
   get(&rlt,d,i,j);
  printf("Case %d: maximum height = %d\n",m,rlt);
 }
 return 0;
}

阅读(2784) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册