HDU4001(动态规划)

来源:互联网 发布:飞思卡尔单片机入门 编辑:程序博客网 时间:2024/05/18 01:35
#include <stdio.h>#include <cstdlib>#include <iostream>#include <algorithm>#include <cstring>using namespace std;struct block{    __int64 a,b,c,d;} bl[1005];bool cmp(block x,block y){    if(x.a!=y.a)        return x.a<y.a;    if(x.b!=y.b)        return x.b<y.b;    return x.d>y.d;}__int64 Max(__int64 a,__int64 b){    if(a>b)        return a;    else        return b;}int main(){    int n;    //freopen("in.txt","r",stdin);    while(scanf("%d",&n)!=EOF)    {        if(n==0)        break;        for(int i=1; i<=n; i++)        {            scanf("%I64d%I64d%I64d%I64d",&bl[i].a,&bl[i].b,&bl[i].c,&bl[i].d);            __int64 temp;            if(bl[i].a<bl[i].b)            {                temp=bl[i].a;                bl[i].a=bl[i].b;                bl[i].b=temp;            }        }        sort(bl+1,bl+1+n,cmp);        __int64 dp[1005];        bl[0].a=0;        bl[0].b=0;        bl[0].c=0;        bl[0].d=0;        memset(dp,0,sizeof(dp));        for(int i=1; i<=n; i++)            for(int j=i-1; j>=0; j--)            {                if(bl[i].d==0&&bl[j].a<=bl[i].a&&bl[j].b<=bl[i].b)                    dp[i]=Max(dp[i],dp[j]+bl[i].c);                if(bl[i].d==1&&bl[j].a<=bl[i].a&&bl[j].b<=bl[i].b&&bl[j].a*bl[j].b<bl[i].a*bl[i].b)                    dp[i]=Max(dp[i],dp[j]+bl[i].c);                if(bl[i].d==2&&bl[j].a<bl[i].a&&bl[j].b<bl[i].b)                    dp[i]=Max(dp[i],dp[j]+bl[i].c);            }        __int64 max=0;        for(int i=1; i<=n; i++)            if(max<dp[i])            {                max=dp[i];            }        printf("%I64d\n",max);    }    return 0;}

0 0
原创粉丝点击