有些类似“叠箱子”问题,看起来一种砖有无限多个,其实最多只能用到两次。
说下我的思路吧,一块砖有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 }