首页 > 编程语言 > 详细

HDU 1069 基础动态规划+排序

时间:2016-03-23 00:44:08      阅读:340      评论:0      收藏:0      [点我收藏+]

题意 给出n种立方体石头 当且仅当一块石头的底部宽度长度都小于一块石头的时候才能放在上面 问最高能放多高?石头不限数目

然而同样一种石头采用同样的摆放方式 两快相同石头一定无法进行放置 所以 一块石头的一种摆放方式最多使用一次

进行一下排序 让长与宽最小的放在最前面 然后就是可爱的dp模板了

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
struct node
{
    int a,b,c;
};
node q[50000];
int dp[50000];
int cmp(node z,node x)
{
    if(z.b==x.b)
        return z.a>x.a;
    else return z.b>x.b;
}
int main(){
int n;
int tt=1;
while(~scanf("%d",&n))
{
    if(n==0)
        break;
    int w=0;
    for(int i=0;i<n;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        q[w].a=x;
        q[w].b=y;
        q[w++].c=z;
        q[w].a=y;
        q[w].b=x;
        q[w++].c=z;
        q[w].a=y;
        q[w].b=z;
        q[w++].c=x;
        q[w].a=z;
        q[w].b=y;
        q[w++].c=x;
        q[w].a=x;
        q[w].b=z;
        q[w++].c=y;
        q[w].a=z;
        q[w].b=x;
        q[w++].c=y;
    }
    sort(q,q+w,cmp);
    dp[0]=q[0].c;
    for(int i=1;i<w;i++)
    {
        int minn=0;
        for(int k=0;k<i;k++)
        {
            if(q[k].a>q[i].a&&q[k].b>q[i].b)
            {
                if(dp[k]>minn)
                {
                    minn=dp[k];
                }
            }
        }
        dp[i]=q[i].c+minn;
    }
    int ans=0;
    for(int i=0;i<w;i++)
    {
        if(dp[i]>ans)
        {
            ans=dp[i];
        }
    }
    printf("Case %d: maximum height = %d\n",tt++,ans);
}
}

  

HDU 1069 基础动态规划+排序

原文:http://www.cnblogs.com/rayrayrainrain/p/5309156.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!