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("\n");

31         for(i=1;i<=count;i++){

32             printf("%d %d %d\n",p[i].x,p[i].y,p[i].z);

33         }    

34         printf("\n");*/

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\n",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\n",++c,ans);

51     }

52     return 0;

53 }
View Code

 

你可能感兴趣的:(HDU)