• HDU 1069 Monkey and Banana(最长递减子序列)


    题目链接

    题意:摞长方体,给定长方体的长宽高,个数无限制,可随意翻转,要求下面的长方体的长和宽都大于上面的,都不能相等,问最多能摞多高。

    题解:个数无限,其实每种形态最多就用一次,把每种形态都单独算一种,同时保证长比宽大,按dp做即可。注意要从小到大摞,从大到小是不对的。

    #include <bits/stdc++.h>
    using namespace std;
    struct sa
    {
        int l,w,h;
    }data[1005];
    int dp[1005],n,d[5];
    bool cmp(sa x,sa y)
    {
        if(x.l==y.l) return x.w<y.w;
        return x.l<y.l;
    }
    int main()
    {
        int t=1;
        while(scanf("%d",&n)&&n)
        {
            int cnt=0;
            for(int i=0;i<n;i++)
            {
                scanf("%d%d%d",&d[0],&d[1],&d[2]);
                sort(d,d+3);
                data[cnt].l=d[1],data[cnt].w=d[0],data[cnt].h=d[2],cnt++;
                data[cnt].l=d[2],data[cnt].w=d[0],data[cnt].h=d[1],cnt++;
                data[cnt].l=d[2],data[cnt].w=d[1],data[cnt].h=d[0],cnt++;
            }
            sort(data,data+cnt,cmp);
            for(int i=0;i<cnt;i++)
                dp[i]=data[i].h;
            for(int i=1;i<cnt;i++)
            for(int j=0;j<i;j++)
            {
                if(data[j].l<data[i].l&&data[j].w<data[i].w)
                {
                    if(dp[i]<dp[j]+data[i].h)//双层for更直观
                        dp[i]=dp[j]+data[i].h;
                }
            }
            int ans=dp[0];
            for(int i=1;i<cnt;i++)
                ans=max(ans,dp[i]);
            printf("Case %d: maximum height = %d
    ",t++,ans);
        }
        return 0;
    }

    传送门:http://blog.csdn.net/qinmusiyan/article/details/7986263

  • 相关阅读:
    天行健宇宙的生与死
    知识库:maven打包时跳过测试
    oracle 行列转换
    C#格式化字符串
    存储过程的使用
    正则表达式
    怎么防止[SQL注入]
    11个月了.
    开通博客喽,
    别的程序员是怎么读你的简历的
  • 原文地址:https://www.cnblogs.com/Ritchie/p/8029394.html
Copyright © 2020-2023  润新知