hdu 4001 dp 2011大连赛区网络赛A

题意:给一些指定长宽高的砖,求能累出的最大高度,不同砖有不同编号,每种编号对下面的砖做出了限制

dp

注意输出要用%I64d,否则会wa,以后不用%lld了

Sample Input

3

10 10 12 0

10 10 12 1

10 10 11 2

2

10 10 11 1

10 10 11 1

0
Sample Output
24

11
#include<cstdio>

#include<iostream>

#include<algorithm>

#include<cstring>

#include<cmath>

#include<queue>

using namespace std;

int n,m,t;

const int maxn=1005;

__int64 dp[maxn];

struct node

{

    int l,w,d,c;

}a[maxn];

bool cmp(node a,node b)

{

    if(a.l!=b.l)    return a.l<b.l;

    if(a.w!=b.w)    return a.w<b.w;

}

int main()

{

    int i,j,k;

    #ifndef ONLINE_JUDGE

    freopen("1.in","r",stdin);

    #endif

    while(scanf("%d",&n)!=EOF&&n)

    {

        for(i=1;i<=n;i++)

        {

            scanf("%d%d%d%d",&a[i].l,&a[i].w,&a[i].c,&a[i].d);  //长宽高

            if(a[i].l<a[i].w)   swap(a[i].l,a[i].w);

        }

        sort(a+1,a+n+1,cmp);

        __int64 ans=0;

        for(i=1;i<=n;i++)

        {

            dp[i]=a[i].c;

            for(j=1;j<i;j++)

            {

                if(a[i].d==0&&a[i].w>=a[j].w&&a[i].l>=a[j].l)

                {

                    dp[i]=max(dp[i],dp[j]+a[i].c);

                }

                if(a[i].d==1&&a[i].w>=a[j].w&&a[i].l>=a[j].l&&(a[i].w>a[j].w||a[i].l>a[j].l))

                {

                    dp[i]=max(dp[i],dp[j]+a[i].c);

                }

                if(a[i].d==2&&a[i].w>a[j].w&&a[i].l>a[j].l)

                {

                    dp[i]=max(dp[i],dp[j]+a[i].c);

                }

            }

            if(dp[i]>ans)   ans=dp[i];

        }

        printf("%I64d\n",ans);

    }

    return 0;

}

 

你可能感兴趣的:(HDU)