返回顶部
大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。遥想公瑾当年,小乔初嫁了,雄姿英发。羽扇纶巾,谈笑间,樯橹灰飞烟灭。故国神游,多情应笑我,早生华发。人生如梦,一尊还酹江月。

The Tower of Babylon UVA - 437

一道dp

#include<bits/stdc++.h>
using namespace std;

const int maxn = 35;

struct node {
    int x,y,z;
    node() {}
    node(int x,int y,int z) :x(x),y(y),z(z) {}
    bool operator < (const node &n)const{
        return (x < n.x&& y < n.y) || (x < n.y&& y < n.x); 
    }
}lft[maxn*3];

int f[maxn*3],m,Case=0,n;

int dp() {
    int ans=0;
    for(int i=1;i<=3*n;i++) {
        f[i]=lft[i].z;
        for(int j=1;j<i;j++) {
                   if(lft[j]<lft[i]) f[i]=max(f[i],f[j]+lft[i].z);
        }
        ans=max(ans,f[i]);
    }
    return ans;
}

bool cmp(node a,node b) {
    return a.x*a.y<b.x*b.y;
}

int main() {
    //freopen("in.txt","r",stdin);
    while(scanf("%d",&n)&&n) {
        memset(f,0,sizeof(f));m=0;
        for(int i=1;i<=n;i++) {
            int x,y,z;scanf("%d%d%d",&x,&y,&z);
            lft[++m]=node(x,y,z);
            lft[++m]=node(x,z,y);
            lft[++m]=node(z,y,x);
        }
        sort(lft+1,lft+1+m,cmp);
         printf("Case %d: maximum height = %d\n",++Case,dp());
    }
    return 0;
}
View Code

 

posted @ 2019-05-10 09:46  plysc  阅读(108)  评论(0编辑  收藏  举报