题目大意:给定n个长方体砖块,每个有长宽高,要求搭成一座塔,对于每个砖块,可以任意旋转,搭在下面的长和宽必须大于上面的。求最高搭多高的塔。
对于每种砖块,转成3种(或2种和1种),它们的高不同,之后动态规划。
状态转移方程:d[i]=max { d[j]+a[i] } (i能放在j下面),d[i]表示以i为起始点时的最高的塔。
#include<stdio.h> #include<stdlib.h> int a[110][3]; int d[110]; int vis[110]; int top; int Dp(int i); int main(void) { int i,n,max,u,v,p,co=0;; scanf("%d",&n); while(n!=0) { top=0; co++; for(i=0;i<n;i++) { scanf("%d%d%d",&u,&v,&p); a[top][0]=u; a[top][1]=v; a[top][2]=p; top++; a[top][0]=u; a[top][1]=p; a[top][2]=v; top++; a[top][0]=v; a[top][1]=p; a[top][2]=u; top++; } for(i=0;i<top;i++) { d[i]=Dp(i); } max=0; for(i=0;i<top;i++) { if(d[i]>max) { max=d[i]; } } printf("Case %d: maximum height = %d\n",co,max); for(i=0;i<top;i++) { d[i]=vis[i]=0; } scanf("%d",&n); } return 0; } int Dp(int i) { int j,u,max; if(vis[i]==1) { return d[i]; } else { max=0; for(j=0;j<top;j++) { if(((a[i][0]>a[j][0])&&(a[i][1]>a[j][1]))||((a[i][0]>a[j][1])&&(a[i][1]>a[j][0]))) { u=Dp(j); if(max<u) { max=u; } } } d[i]=a[i][2]+max; vis[i]=1; return d[i]; } }
UVA 437-The Tower of Babylon(DP)
原文地址:http://blog.csdn.net/dilemma729/article/details/45057899