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 }

 

posted @ 2021-03-13 15:41  acmloser  阅读(61)  评论(0编辑  收藏  举报