HDU 4001 To Miss Our Children Time(DP LIS)

来源:互联网 发布:淘宝做图片用什么软件 编辑:程序博客网 时间:2024/05/17 03:09

题目大意:给定一些木块的长宽高及其编号,
1、如果编号为0,则应该满足当前木块长(&&宽)>=下边的木块长(宽)
2、如果编号为1,则应该满足当前木块长(&&宽)>=下边的木块长(宽)&&面积也比下边木块面积大
3、如果编号为0,则应该满足当前木块长(&&宽)>下边的木块长(宽)

思路:类似于DP的LIS只不过求得是高度,输入数据后注意排序并且结构体的所有成员都要排序,注意在数据都不符合条件的时候,dp[]正确的初始化边起倒不小的作用,然后就是暴力DP找最大。

#include<map>#include<queue>#include<cmath>#include<iostream>#include<cstdio>#include<stack>#include<cstring>#include<algorithm>#define LL __int64#define inf 0x3f3f3f3fconst double PI=acos(-1.0);using namespace std;LL dp[1010];struct node{    LL l,w,h,d;}q[1010];LL op(node a,node b){    if(a.l!=b.l)        return a.l<b.l;    if(a.w!=b.w)        return a.w<b.w;    if(a.h!=b.h)        return a.h<b.h;    if(a.d!=b.d)    return a.d>b.d;}int main(){    LL n,m,i,j,k,l,w,h;    while(~scanf("%I64d",&n)&&n){        memset(dp,0,sizeof(dp));        for(i=0;i<n;++i){            scanf("%I64d%I64d%I64d%I64d",&q[i].l,&q[i].w,&q[i].h,&q[i].d);            if(q[i].w>q[i].l){                swap(q[i].w,q[i].l);            }        }        sort(q,q+n,op);        LL ans=0;        for(i=0;i<n;++i){            dp[i]=q[i].h;            for(j=0;j<i;++j){                LL now=q[i].l*q[i].w;                LL pre=q[j].l*q[j].w;                LL nl=q[i].l,nw=q[i].w;                LL pl=q[j].l,pw=q[j].w;                if( (nl>pl&&nw>pw)&&q[i].d==2&&(dp[i]<(dp[j]+q[i].h) ) ){                    dp[i]=dp[j]+q[i].h;                }                if((nl>=pl)&&(nw>=pw)&&q[i].d==0&&( dp[i]<(dp[j]+q[i].h) ) ){                    dp[i]=dp[j]+q[i].h;                }                if( (nl>=pl)&&(nw>=pw)&&(now>pre)&&q[i].d==1&&(dp[i]<(dp[j]+q[i].h) ) )                    dp[i]=dp[j]+q[i].h;            }            if(ans<dp[i])                ans=dp[i];        }        printf("%I64d\n",ans);    }    return 0;}
0 0
原创粉丝点击