#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;
}
HDU4001(动态规划)
最新推荐文章于 2016-02-24 15:12:03 发布