Dag nested model. The state equation is changed from 1 to height.
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #define doumax(a,b) (a>b?a:b) 5 const int maxn=100; 6 int mat[maxn][maxn],dp[maxn],n,a[35][5],nodenum; 7 struct node{ 8 int l,w,h; 9 void init(int x,int y,int z)10 {11 l=x;w=y;h=z;12 }13 bool operator<(const node & temp)14 {15 return l<temp.l && w<temp.w;16 }17 }block[maxn];18 int dpmodel(int i);19 int main()20 {21 int t=1;22 while(scanf("%d",&n)==1 && n){23 nodenum=0;24 memset(mat,0,sizeof(mat));25 memset(dp,0,sizeof(dp));26 for(int i=0;i<n;i++){27 scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);28 std::sort(a[i],a[i]+3);29 for(int j=0;j<2;j++)30 for(int k=j+1;k<3;k++)31 block[++nodenum].init(a[i][j],a[i][k],a[i][3-j-k]);32 }33 for(int i=1;i<=nodenum;i++)34 for(int j=i+1;j<=nodenum;j++){35 if(block[i]<block[j])36 mat[i][j]=1;37 else if(block[j]<block[i])38 mat[j][i]=1;39 }40 int maxheight=0;41 for(int i=1;i<=nodenum;i++){42 if(!dp[i]){43 int ans=dpmodel(i);44 if(maxheight<ans)45 maxheight=ans;46 }47 }48 printf("Case %d: maximum height = %d\n",t++,maxheight);49 }50 return 0;51 }52 int dpmodel(int i)53 {54 if(dp[i]>0)55 return dp[i];56 dp[i]=block[i].h;57 for(int j=1;j<=nodenum;j++)58 if(mat[i][j])59 dp[i]=doumax(dp[i],dpmodel(j)+block[i].h);60 return dp[i];61 }