zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Django其五
    数据库操作
    小程序navigateBack,子页面传值给父页面
    深拷贝
    sql语句case when 以及left()
    IE高级配置中,存在SSL支持协议,例如SSL TLS。
    linux服务器后台运行服务
    各种浏览器文件下载
    localStorage sessionStorage 用法
    url编码乱码问题解决
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4290367.html
Copyright © 2011-2022 走看看