Monkey and Banana HDU - 1069
考察:线性dp
LIS模型
思路:
对于每一个砖块,存储6个不同的情况.将所有砖块按a,b排序,然后按LIS的模板做即可,不用担心a很小,b很大的情况.a很小注定了放在它前面的只能是a更小的.
上面是LIS的思路,本蒟蒻是三重循环未排序,因为未排序所以二重循环会出现小砖块没更新的情况,所以要三重循环全部更新.
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int N = 32; 6 struct Wood{ 7 int a,b,h; 8 }w[N*6]; 9 int n,f[N*6],kcase,cnt; 10 void get(int a,int b,int h) 11 { 12 w[++cnt].a = a; 13 w[cnt].b = b; 14 w[cnt].h = h; 15 } 16 int main() 17 { 18 while(scanf("%d",&n)!=EOF&&n) 19 { 20 int ans = 0; 21 cnt = 0; 22 for(int i=1;i<=n;i++) 23 { 24 int a,b,c; scanf("%d%d%d",&a,&b,&c); 25 get(a,b,c); get(a,c,b); 26 get(b,a,c); get(b,c,a); 27 get(c,a,b); get(c,b,a); 28 } 29 for(int i=1;i<=cnt;i++) f[i] = w[i].h; 30 for(int k=1;k<=cnt;k++) 31 { 32 for(int i=1;i<=cnt;i++) 33 { 34 int a = w[i].a,b = w[i].b; 35 for(int j=1;j<=cnt;j++)//f[j]代表以j为最上层的高度. 36 if(w[j].a>a&&w[j].b>b) f[i] = max(f[i],f[j]+w[i].h); 37 } 38 } 39 for(int i=1;i<=cnt;i++) ans = max(f[i],ans); 40 printf("Case %d: maximum height = %d\n",++kcase,ans); 41 } 42 return 0; 43 }