您的位置:首页 > 其它

poj 2241 The Tower of Babylon

2015-08-13 23:46 447 查看
题目:点击打开链接

题意:给你无数个各种类型的砖块,(不超过30种),选择一些木块把他们来推起来,要求下面的一层比上面的一层的变长都要短,问可以堆得最高高度;

分析:因为砖块的长宽高是可以互相交换的,虽然说每种砖块可以有无数个,但是用的不会超过3个,因为第四个肯定会和3个中长宽高是一样的。所以我们就可以从3*n个砖块中求解了,再将砖块按长排序,这就变成了一个背包问题了,排序可以从大到小排,然后dp的时候,从小开始递推,从3*n-2开始,在这个基础上叠加后面小的,每次找出一个符合条件的最高的以后,更新b[I].z,下一次j走到I的时候,就直接找一个ans就好了

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
struct block
{
    int x,y,z;
}b[95];
bool cmp(block a,block b)
{
    return a.x>b.x;
}
int main()
{
    int n,x,y,z,flag=1;
    while(cin>>n&&n){
        int maxn=0;
        for(int i=0;i<3*n;){
            cin>>x>>y>>z;
            b[i].x=max(x,y);b[i].y=min(x,y);b[i++].z=z;
            b[i].x=max(x,z);b[i].y=min(x,z);b[i++].z=y;
            b[i].x=max(y,z);b[i].y=min(y,z);b[i++].z=x;
        }
        sort(b,b+3*n,cmp);
        for(int i=3*n-2;i>=0;i--){
            int ans=0;
            for(int j=i+1;j<3*n;j++)
                if(b[i].x>b[j].x&&b[i].y>b[j].y&&b[j].z>ans)
                ans=b[j].z;
            b[i].z+=ans;
            if(b[i].z>maxn)maxn=b[i].z;
        }
         cout<<"Case "<<flag++<<": maximum height = "<<maxn<<endl;
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: