hdu-1069(dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069

题意:一群猴子,给出n块砖的长x宽y高z,用这些砖拼起的高度最高是多少,

要求底下的砖的长宽都要大于上面那块。堆出高度最高的猴子最聪明。现在问最多能达到多高。

思路:从n块砖中找出x块砖并满足长宽要求使高度最高,可以用动态规划来做。

先按照砖的x,y升序排序,类似最长不下降子序列。

状态转移方程:dp[i]=h[i]+max(dp[0]……dp[i-1]);

参考文章:https://blog.csdn.net/lttree/article/details/26606947

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
struct Node{
    int l,w,h;
};
vector <Node> vc;
int dp[100100];
bool cmp(Node a,Node b)
{
    if(a.l!=b.l) return a.l<b.l;
    else return a.w<b.w;
}
int main(void)
{
    int n,x,y,z,pt=1;
    Node tmp;
    while(~scanf("%d",&n)&&n)
    {
        vc.clear();
        memset(dp,0,sizeof(dp));
        while(n--)
        {
            scanf("%d %d %d",&x,&y,&z);
            tmp.l=x;tmp.w=y;tmp.h=z;vc.push_back(tmp);
            tmp.l=x;tmp.w=z;tmp.h=y;vc.push_back(tmp);
            tmp.l=y;tmp.w=x;tmp.h=z;vc.push_back(tmp);
            tmp.l=y;tmp.w=z;tmp.h=x;vc.push_back(tmp);
            tmp.l=z;tmp.w=y;tmp.h=x;vc.push_back(tmp);
            tmp.l=z;tmp.w=x;tmp.h=y;vc.push_back(tmp);
        }
        sort(vc.begin(),vc.end(),cmp);
        int mx,j,i,l=vc.size();
        dp[0]=vc[0].h;
        for(i=1;i<l;i++)
        {
            mx=0;
            for(j=0;j<i;j++)
            {
                if(vc[j].l<vc[i].l&&vc[j].w<vc[i].w)
                mx=mx>dp[j]?mx:dp[j];
            }
            dp[i]=vc[i].h+mx;
        }
        mx=0;
        for(i=0;i<l;i++)
        {
            mx=mx>dp[i]?mx:dp[i];
        }
        printf("Case %d: maximum height = %d\n",pt++,mx);
    }
    return 0;
}

 

posted @ 2018-10-07 14:58  麟阁  阅读(144)  评论(0编辑  收藏  举报