ACM HDU 4001 To Miss Our Children Time (2011ACM大连赛区网络赛)

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

本文作者:kuangbin   @SHU

作者博客:www.cnblogs.com/kuangbin

转载请注明出处。THX

题意:
小孩子玩积木堆房子的情景:
每组测试数据第一行给出n,代表接下来有n块砖;
接下来n行,每行给出砖的长,宽,高,属性(a,b,c,d);
属性d:d=0:该砖的长度和宽度(a,b)要比垫在他下面的砖的长,宽大或者相等;就是长>=长,宽>=宽
d=1:改砖的宽度和长度要比下面的砖的长度大或者相等,同时,该砖的宽度值和面积值要比下面的砖的面积值大;即长>=长,宽>=宽,面积>面积。也就是长>=长&&宽>=宽&&(长>长||宽>宽)

d=2:该砖的长度和宽度(a,b)要比垫在他下面的砖的长,宽大(严格大于);长>长,宽>宽。
要求输出该给出的所有的砖块所能听堆砌的最大高度。

比赛时没有想到,看了同校的大牛做出来的代码之后恍然大悟。原来按照长、宽排一下序,然后DP解决。

代码很清楚简洁了。。看代码吧!

 

看代码:

#include <iostream>
#include
<algorithm>
using namespace std;

struct rec
{
int l,w,c,d;
}d[
1100];
int cmp(const void *a,const void *b)//先按长再按宽从小到大排序
{
rec t1,t2;
t1
= *(rec *)a;
t2
= *(rec *)b;
if(t1.l != t2.l)return t1.l - t2.l;
if(t1.w != t2.w)return t1.w - t2.w;
return t2.d - t1.d;
}
int n ;
long long f[1100],ans;

int main()
{
while(~scanf("%d",&n)&&n)
{
for(int i = 1;i <= n; i ++)
{
scanf(
"%d %d %d %d",&d[i].l,&d[i].w,&d[i].c,&d[i].d);
if(d[i].l<d[i].w)swap(d[i].l,d[i].w);
}
qsort(
&d[1],n,sizeof(d[1]),cmp);
ans
= 0 ;
for(int i = 1;i <= n; i ++)//DP
{
f[i]
= d[i].c;
for(int j = 1; j < i ; j ++)
{
if(d[i].d == 0 && d[i].w >= d[j].w && d[i].l >= d[j].l)
{
f[i]
= max(f[i],f[j]+d[i].c);
}
if(d[i].d == 1 && d[i].w >= d[j].w && d[i].l >= d[j].l && (d[i].w > d[j].w || d[i].l > d[j].l))//ok
{
f[i]
= max(f[i],f[j]+d[i].c);
}
if(d[i].d == 2 && d[i].w > d[j].w && d[i].l > d[j].l)//ok
{
f[i]
= max(f[i],f[j]+d[i].c);
}
}
if(f[i] > ans)ans = f[i];
}
cout
<< ans << endl;
}
return 0;
}


 

你可能感兴趣的:(children)