hdu1069 dp

题意:有若干种不同规格(长、宽、高)的砖块,每种砖块有无数个,可以自由选择以砖块的哪条边做长、宽或高,用这些砖块搭高塔,要求上面砖块的长宽必须严格小于下面砖块的长宽,问塔最高能有多高

我的做法是每读入一组长宽高,就把它分为三种不同的、长宽高定好的砖块,全部读完之后将这些砖块依次按照长宽高排序,从长宽最大的砖块开始依次求以该砖块为顶的塔最高能有多高:

对于第 i 块砖,我想前寻找第一块长宽均比它大的砖块 j ,进行优化:

dp [ i ] = max ( dp [ i ] , dp [ j ] + p [ i ] . z ) ; p [ i ] . z 就是第 i 块砖的高度。

dp 完之后再遍历一遍寻找最大的高度,当然,其实在 dp 的过程中就可以进行最大值的选取了。

 1 int main(){
 2     int d[4],n,c=0;
 3     while(scanf("%d",&n)!=EOF&&n!=0){
 4         memset(dp,0,sizeof(dp));
 5         p[0].x=p[0].y=0xFFFFFFF;
 6         p[0].z=0;
 7         int i,j,count=0;
 8         for(int q=1;q<=n;q++){
 9             scanf("%d%d%d",&d[1],&d[2],&d[3]);
10             for(i=1;i<=2;i++){
11                 for(j=i+1;j<=3;j++){
12                     if(d[i]<d[j]){
13                         int t=d[i];
14                         d[i]=d[j];
15                         d[j]=t;
16                     }
17                 }
18             }
19             p[++count].x=d[1];
20             p[count].y=d[2];
21             p[count].z=d[3];
22             p[++count].x=d[1];
23             p[count].y=d[3];
24             p[count].z=d[2];
25             p[++count].x=d[2];
26             p[count].y=d[3];
27             p[count].z=d[1];
28         }
29         sort(p+1,p+count+1,cmp);
30 /*        printf("
");
31         for(i=1;i<=count;i++){
32             printf("%d %d %d
",p[i].x,p[i].y,p[i].z);
33         }    
34         printf("
");*/
35         for(i=1;i<=count;i++){
36         
37             for(j=i-1;j>=0;j--){
38 
39             if (p[i].x<p[j].x&&p[i].y<p[j].y){
40 
41                     dp[i]=max(dp[i],dp[j]+p[i].z);
42                 }
43             }
44         }
45 //    for(i=1;i<=count;i++)printf("%d %d
",i,dp[i]);
46         int ans=0;
47         for(i=1;i<=count;i++){
48             if(dp[i]>ans)ans=dp[i];
49         }
50         printf("Case %d: maximum height = %d
",++c,ans);
51     }
52     return 0;
53 }
View Code
原文地址:https://www.cnblogs.com/cenariusxz/p/4290367.html