首页 > 代码库 > HDU 1069 Monkey and Banana

HDU 1069 Monkey and Banana

http://acm.hdu.edu.cn/showproblem.php?pid=1069

题意:给出立方体,求出所能搭成的最大高度,要求是上面一块立方体的长和宽必须严格小于下面一块的长和宽。

思路:每输入一个立方体的长宽高数据,长宽高各自排列组合可以形成6个立方体。用sort函数根据立方体的长从小到大进行排序,次要排序条件为宽。

 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4  5 struct node 6 { 7     int l, w, h; 8 }v[181]; 9 10 int dp[181];  //存储第i块立方体为底时的最大高度11 12 bool cmp(node x, node y)  //sort的排序方法,按长从小到大排序13 {14     /*15     if (x.l < y.l)  return 1;16     else if (x.l == y.l && x.w < y.w)  return 1;17     else return 0;18     */19 20     if (x.l == y.l)  return x.w < y.w;21     return x.l < y.l;22 }23 24 25 int main()26 {27     //freopen("D:\\txt.txt", "r", stdin);28     int n, a, b, c;29     int kase = 0;30     while (cin >> n && n)31     {32         int k = 0;33         for (int i = 0; i < n; i++)34         {35             cin >> a >> b >> c;36             v[k].l = a; v[k].w = b; v[k++].h = c;37             v[k].l = a; v[k].w = c; v[k++].h = b;38             v[k].l = b; v[k].w = a; v[k++].h = c;39             v[k].l = b; v[k].w = c; v[k++].h = a;40             v[k].l = c; v[k].w = a; v[k++].h = b;41             v[k].l = c; v[k].w = b; v[k++].h = a;42         }43         sort(v, v + k, cmp);44         int maxn = 0;45         for (int i = 0; i < k; i++)46         {47             dp[i]=v[i].h;48             for (int j = 0; j < i; j++) 49             {50                 if (v[j].l < v[i].l && v[j].w < v[i].w) //如果第j块能搭在第i块上51                 {52                     dp[i] = max(dp[i], dp[j] + v[i].h); 53                 }54             }55             if (dp[i]>maxn) maxn = dp[i];56         }57         cout << "Case " << ++kase << ": maximum height = " << maxn << endl;58     }59     return 0;60 }

 

HDU 1069 Monkey and Banana