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\n",t++,ans);
    }
    return 0;
}

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

posted @ 2017-12-12 19:36  Ritchie丶  阅读(185)  评论(0编辑  收藏  举报