UVA 437 The Tower of Babylon

有些类似“叠箱子”问题,看起来一种砖有无限多个,其实最多只能用到两次。

说下我的思路吧,一块砖有3个数据,虽然3!=6,但本质上还是只有3种,把这三种都表示出来,使x<=y;这样就有了3n组数据。因为我不会建图,就把这3n组数据再排列一下,使一块砖只能放到它后面的砖之上,而绝不能放到之前的砖上,即按x为一级y为二级升序排列,结合之前的x<=y,就能达到目的了。比如:两块砖,31*41*59和26*53*58,经过排序后变为:

26 53 58

26 58 53

31 41 59

31 59 41

41 59 31

53 58 26

接下来就是DP了……

这题我做得很坎坷,因为想用sort不用qsort,又写了回好久没写的C++;但是坑爹的sort不支持二维数组,只好改为结构体;最后因为更新状态的细节又WA了好几次。我把WA的代码贴一下:

t = 0;

for

{

  for

}

这是其一;

for

{

  t = 0;

  for

}

这是其二。至于为什么错了,我就不说了,读者自己想吧。

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <algorithm>
 4 using namespace std;
 5 typedef struct
 6 {
 7     int arr[3];
 8 }Box;
 9 Box a[100];
10 bool cmp(Box a,Box b)
11 {
12     if(a.arr[0] != b.arr[0])
13         return a.arr[0] < b.arr[0];
14     else if(a.arr[1] != b.arr[1])
15         return a.arr[1] < b.arr[1];
16     else return a.arr[2] < b.arr[2];
17 }
18 int ok(Box a,Box b)
19 {
20     return (a.arr[0] < b.arr[0] && a.arr[1] < b.arr[1]);
21 }
22 int main()
23 {
24     int n,m=0,i,j,t,max;
25     while(cin>>n,n)
26     {
27         m++;
28         for(i = 0; i < 3*n; i += 3)
29         {
30             cin>>a[i].arr[0]>>a[i].arr[1]>>a[i].arr[2];
31             sort(a[i].arr,a[i].arr+3);
32             a[i+1].arr[0] = a[i].arr[0];
33             a[i+1].arr[1] = a[i].arr[2];
34             a[i+1].arr[2] = a[i].arr[1];
35             a[i+2].arr[0] = a[i].arr[1];
36             a[i+2].arr[1] = a[i].arr[2];
37             a[i+2].arr[2] = a[i].arr[0];
38          }
39         sort(a,a+3*n,cmp);
40         max = 0;
41         for(i = 3*n-2; i >= 0; i--)
42         {
43             t = a[i].arr[2];
44             for(j = i+1; j < 3*n; j++)
45             {
46                 if(ok(a[i],a[j]) && a[i].arr[2]+a[j].arr[2] > t)
47                     t = a[i].arr[2]+a[j].arr[2];
48             }
49             a[i].arr[2] = t;
50             if(t > max) max = t;
51         }
52         printf("Case %d: maximum height = %d\n",m,max);
53     }
54     return 0;
55 }
原文地址:https://www.cnblogs.com/lzxskjo/p/2489871.html