POJ-2241 uva 437 The Tower of Babylon 记忆化搜索 DAG最长路

来源:互联网 发布:照片马赛克软件 编辑:程序博客网 时间:2024/06/07 12:53

题意链接:http://poj.org/problem?id=2241

题意:有n种不同类型的“块”,每种块有无数多个,“块”是一个立方体,有三个边长度为x,y,z。现在要搭建一个塔,要求是使得塔的高度最高,并且上下两块砖,上底面能够含于下底面。

假设底面边长分别为a,b 和c,d ,(a,b)要含于(c,d)需满足:a<c 且 b<d 或 a<d 且b<c ,剩下的边是高,有n种砖,扩展成3n个结点,如果a含于b ,则添加一条a到b的边,构成的图不会成环

#include<cstdio>#include<cstring>#include<vector>#define Max(a,b) a>b?a:busing namespace std;const int maxn = 200;vector<int> g[maxn];vector<int> h;struct point;vector<point> s;int d[maxn];int ans;struct point{int x,y;}pt;int dp(int i)//从i点出发的最大高度 {if(d[i]>0)return d[i];d[i]=h[i];for(int j=0;j<g[i].size();j++){int v = g[i][j];d[i] = Max(d[i],dp(v)+h[i]);}return d[i];}int main(){int n,x,y,z,kcase=0;while(scanf("%d",&n)==1&&n){ans=-100;for(int i=0;i<3*n;i++)g[i].clear();s.clear();h.clear();memset(d,0,sizeof(d));for(int i=0;i<n;i++){scanf("%d%d%d",&x,&y,&z);pt = {x,y};s.push_back(pt);h.push_back(z);pt = {x,z};s.push_back(pt);h.push_back(y);pt = {y,z};s.push_back(pt);h.push_back(x);}for(int i=0;i<s.size();i++)for(int j=0;j<s.size();j++){if((s[i].x<s[j].x&&s[i].y<s[j].y)||(s[i].y<s[j].x&&s[i].x<s[j].y)){g[i].push_back(j);}}for(int i=0;i<s.size();i++){dp(i);if(ans<d[i])ans=d[i];}printf("Case %d: maximum height = %d\n",++kcase,ans);}}

0 0
原创粉丝点击