hdu 1069: monkey and banana

考虑N种不同立方体最多可以有3×N种立方体选择,再对立方体进行排序排序后解决状态方程
cube[i].max = MAX(cube[i].max,cube[j].max +cube[i].z)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

#include<string.h>
#include<stdlib.h>
#define MAX(x,y) (x)>(y)?(x):(y)
void (int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
return;
}
typedef struct DataType
{
int x;
int y;
int z;
int max;
}DataType;
DataType cube[100];
int cmp(const void *a,const void *b)
{
DataType *c = (DataType*)a;
DataType *d = (DataType*)b;
if(c->x != d->x)
return d->x - c->x;
else if ( c->y != d->y )
return d->y - c->y;
else
return d->z - c->z;
}
int main()
{

int n,T;
int i,j,k;
int xi,yi,zi;
int maxH;
T = 1;
while ( scanf("%d",&n),n)
{
k = 0;
for ( i = 0; i < n; i++)
{
scanf("%d%d%d",&xi,&yi,&zi);
cube[k].x = xi;
cube[k].y = yi;
if ( cube[k].x > cube[k].y)
swap(&cube[k].x,&cube[k].y);
cube[k++].z = cube[k].z = zi;
cube[k].x = yi;
cube[k].y = zi;
if ( cube[k].x > cube[k].y)
swap(&cube[k].x,&cube[k].y);
cube[k++].z = cube[k].z = xi;
cube[k].x = xi;
cube[k].y = zi;
if ( cube[k].x > cube[k].y)
swap(&cube[k].x,&cube[k].y);
cube[k++].z = yi;
}
qsort(cube,k,sizeof(cube[0]),cmp); //按照从大到小排序
maxH = 0;
for ( i = 0 ; i < k ; i++)
{
cube[i].max = cube[i].z;
for ( j = i - 1; j >= 0; j--)
{
if ( cube[i].x < cube[j].x && cube[i].y < cube[j].y )
cube[i].max = MAX(cube[i].max,cube[j].max + cube[i].z);
}
maxH = MAX(maxH,cube[i].max);
}
printf("Case %d: maximum height =%dn",T++, maxH);
}
return 0;
}