求最长单调递减序列。
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 }