首页 > 代码库 > uva437(经典DAG题目)
uva437(经典DAG题目)
题意:有n(n<=30)中立方体,每种都有无数多个,要求选一些立方体摞成一根尽量高的柱子,立方体使用时的三种摆放方式都可以。并且使得每个立方体的底面长宽分别小于它下方的立方体的底面长宽。
解法:其中每种立方体有三种摆放方式,可以将每种转化成三种立方体,因为一个立方体不可能在一个相同的自己上面,所有每种一个就够了。90个点,并且是有向无环的图,求最长路径,可以拓扑排序,也可以dfs。
代码:
/****************************************************** * @author:xiefubao *******************************************************/ #pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <vector> #include <algorithm> #include <cmath> #include <map> #include <set> #include <stack> #include <string.h> //freopen ("in.txt" , "r" , stdin); using namespace std; #define eps 1e-8 #define zero(_) (abs(_)<=eps) const double pi=acos(-1.0); typedef long long LL; const int Max=110; const LL INF=0x3FFFFFFF; struct node { int x,y; int tall; } points[Max]; bool operator<(const node& a,const node& b) { return (a.x<b.x&&a.y<b.y)||(a.y<b.x&&a.x<b.y); } vector<int> vec[Max]; int ans[Max]; int n; void dfs(int t) { if(ans[t]!=-1) return ; int ma=0; for(int i=0;i<vec[t].size();i++) { dfs(vec[t][i]); ma=max(ma,ans[vec[t][i]]); } ans[t]=ma+points[t].tall; } int main() { int kk=1; while(cin>>n&&n) { for(int i=0;i<3*n;i++) vec[i].clear(); for(int i=0;i<n;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); points[i*3].x=a; points[i*3].y=b; points[i*3].tall=c; points[i*3+1].x=a; points[i*3+1].y=c; points[i*3+1].tall=b; points[i*3+2].x=b; points[i*3+2].y=c; points[i*3+2].tall=a; } for(int i=0;i<n*3;i++) for(int j=0;j<n*3;j++) { if(points[i]<points[j]) vec[i].push_back(j); } memset(ans,-1,sizeof ans); int ma=0; for(int i=0;i<n*3;i++) { dfs(i); ma=max(ma,ans[i]); } printf("Case %d: maximum height = %d\n",kk++,ma); } return 0; }
uva437(经典DAG题目)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。