HDU 1069 Monkey and Banana

求最长单调递减序列。

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<cstdio>
 6 #include<set>
 7 #include<map>
 8 #include<vector>
 9 #include<cstring>
10 #include<stack>
11 #include<cmath>
12 #include<queue>
13 #include <bits/stdc++.h>
14 using namespace std;
15 #define INF 0x3f3f3f3f
16 #define ll long long
17 #define clc(a,b) memset(a,b,sizeof(a))
18 const int maxn=1000000;
19 const int mod=1e9+7;
20 
21 int d[3];
22 int n;
23 int dp[110];
24 struct node
25 {
26     int w,l,h;
27 } box[110];
28 
29 bool cmp(node a,node b)
30 {
31     if(a.l>b.l) return true;
32     if(a.l==b.l&&a.w>b.w) return true;
33     return false;
34 }
35 
36 int main()
37 { 
38     int c=1;
39     while(~scanf("%d",&n),n)
40     {
41         int k=0;
42         int sum=0;
43         clc(dp,0);
44         for(int i=0; i<n; i++)
45         {
46             scanf("%d%d%d",&d[0],&d[1],&d[2]);
47             sort(d,d+3);
48             box[k].l=d[2];
49             box[k].w=d[1];
50             box[k].h=d[0];
51             k++;
52             box[k].l=d[2];
53             box[k].w=d[0];
54             box[k].h=d[1];
55             k++;
56             box[k].l=d[1];
57             box[k].w=d[0];
58             box[k].h=d[2];
59             k++;
60         }
61         sort(box,box+k,cmp);
62         for(int i=0; i<k; i++)
63             dp[i]=box[i].h;
64         for(int i=k-2; i>=0; i--)
65         {
66             for(int j=i+1; j<k; j++)
67             {
68                 if(box[i].l>box[j].l&&box[i].w>box[j].w)
69                     if(dp[i]<box[i].h+dp[j])
70                         dp[i]=box[i].h+dp[j];
71             }
72         }
73         sum=dp[0];
74         for(int i=0; i<k; i++)
75         {
76             if(sum<dp[i])
77                 sum=dp[i];
78         }
79         printf("Case %d: maximum height = %d
",c++,sum);
80     }
81     return 0;
82 }
View Code
原文地址:https://www.cnblogs.com/ITUPC/p/5164914.html