链接:http://acm.hdu.edu.cn/showproblem.php?pid=4001
亚洲区预选赛大连赛区的网络赛题目,简单的DP,首先按照长度宽度和id值进行一遍排序,这一遍排序虽然保证不了在第i个前面的都是可以被第i个放到其上面的,但是保证了在第i个后面的都是不可以的。排序之后的dp[i]表示第i个放上之后的最优值。

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cstdlib> 5 #define N 1005 6 using namespace std; 7 typedef long long LL; 8 LL dp[N]; 9 struct node 10 { 11 LL len,wid,h,area; 12 LL id; 13 }; 14 node bl[N]; 15 int cmp(const void *a,const void *b) 16 { 17 node *c=(node *)a; 18 node *d=(node *)b; 19 if(c->len==d->len) 20 { 21 if(c->wid==d->wid) 22 { 23 if(c->id>d->id) 24 return -1; 25 else 26 return 1; 27 } 28 else if(c->wid>d->wid) 29 return 1; 30 else 31 return -1; 32 } 33 else if(c->len>d->len) 34 return 1; 35 else 36 return -1; 37 } 38 int main() 39 { 40 LL n,i,j,xmax; 41 LL a,b; 42 while(scanf("%I64d",&n)&&n) 43 { 44 for(i=1;i<=n;i++) 45 { 46 scanf("%I64d%I64d%I64d%I64d",&a,&b,&bl[i].h,&bl[i].id); 47 bl[i].len=a>b?a:b; 48 bl[i].wid=a<b?a:b; 49 bl[i].area=a*b; 50 } 51 qsort(bl+1,n,sizeof(node),cmp); 52 for(i=1;i<=n;i++) 53 dp[i]=bl[i].h; 54 for(i=2;i<=n;i++) 55 { 56 xmax=0; 57 if(bl[i].id==2) 58 { 59 for(j=1;j<i;j++) 60 if(bl[j].len<bl[i].len&&bl[j].wid<bl[i].wid&&xmax<dp[j]) 61 xmax=dp[j]; 62 } 63 else if(bl[i].id==1) 64 { 65 for(j=1;j<i;j++) 66 { 67 if(bl[j].len<=bl[i].len&&bl[j].wid<=bl[i].wid&&bl[j].area<bl[i].area&&xmax<dp[j]) 68 xmax=dp[j]; 69 } 70 } 71 else 72 { 73 for(j=1;j<i;j++) 74 { 75 if(bl[j].len<=bl[i].len&&bl[j].wid<=bl[i].wid&&xmax<dp[j]) 76 xmax=dp[j]; 77 } 78 } 79 dp[i]=bl[i].h+xmax; 80 } 81 xmax=0; 82 for(i=1;i<=n;i++) 83 if(dp[i]>xmax) 84 xmax=dp[i]; 85 printf("%I64d\n",xmax); 86 } 87 return 0; 88 }