hdu1069

题意:把给定的长方体(不限个数)叠加在一起,要求上面一个长方体的长和宽都比下面长方体的小,求这些长方体能叠加的最高的高度.(其中(3,2,1)可以摆放成(3,1,2)、(2,1,3)等)。

思路:其实就是求最长的单调递减序列。在长和宽的递减下,求最大能得出的最大高度了。

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<algorithm>
 5 #include<math.h>
 6 using namespace std;
 7 
 8 struct block{
 9     int x,y,z;
10 }a[100];
11 
12 bool cmp(block a,block b)
13 {
14     if(a.x>b.x) 
15     return true;//按横坐标由大到小排序 
16     if(a.x==b.x&&a.y>b.y) return true;//按 纵坐标排序 
17     return false;
18 }
19 
20 int dp[100]={0};
21 
22 int main()
23 {
24     int n,d[3],t=1;
25     while(cin>>n)
26     {
27         if(n==0) break;
28     //    memset(a,0,sizeof(a));
29         int k=0;
30         for(int i = 0;i< n ;i++)
31         {
32             cin>>d[0]>>d[1]>>d[2];//??为什么排序 ?不排序会WA, 
33             sort(d,d+3);
34             a[k].x=d[2];a[k].y=d[1];a[k].z=d[0];k++;//保持x为底边最小边 便于排序后比较。,高分别取三个不同值 
35             a[k].x=d[2];a[k].y=d[0];a[k].z=d[1];k++;
36             a[k].x=d[1];a[k].y=d[0];a[k].z=d[2];k++;
37         }
38         sort(a,a+k,cmp);
39         for(int i =0; i < k ;i++)dp[i]=a[i].z;
40         for(int i = k-1;i >= 0;i--) //看的题解是k-2,可是我觉得是k-1,不过两个都AC了 
41         {                //上面是从大到小排序,这里从最小开始遍历
42             for(int j = i+1;j<k;j++)
43             {
44                 if(a[i].x>a[j].x&&a[i].y>a[j].y)//最长递减序列和 
45                     if(dp[i]<dp[j]+a[i].z)
46                         dp[i]=dp[j]+a[i].z; 
47             }
48         }
49         int ans =dp[0];
50         for(int i=0;i<k;i++)
51         {
52             if(ans<dp[i])ans=dp[i];
53          } 
54          printf("Case %d: maximum height = %d
",t,ans);
55          t++;
56     }
57     return 0;
58 }
原文地址:https://www.cnblogs.com/lyqf/p/9770024.html