HDOJ 4001-To Miss Our Children Time解题报告

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4001

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

View Code
 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 }

 

posted @ 2012-08-28 16:13  zhenhai  阅读(149)  评论(0编辑  收藏  举报