题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1069
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=30+5;
int rec[maxn][3],N;
int d[maxn][3]; //d[idx][i] 以第idx的矩形为底边,i边为高的,摞最大高
int DP(int idx,int k)
{
int& ans=d[idx][k];
if(ans!=-1) return ans;
ans=0;
for(int nidx=0;nidx<N;nidx++)
for(int nk=0;nk<3;nk++){
if((rec[idx][(k+1)%3]>rec[nidx][(nk+1)%3]&&rec[idx][(k+2)%3]>rec[nidx][(nk+2)%3])||
(rec[idx][(k+2)%3]>rec[nidx][(nk+1)%3]&&rec[idx][(k+1)%3]>rec[nidx][(nk+2)%3]))
ans=max(ans,DP(nidx,nk));
}
ans+=rec[idx][k];
return ans;
}
int main()
{
int kase=0;
while(cin>>N,N)
{
for(int i=0;i<N;i++)
for(int j=0;j<3;j++)
scanf("%d",&rec[i][j]);
memset(d,-1,sizeof(d));
int ans=0;
for(int i=0;i<N;i++)
for(int j=0;j<3;j++)
ans=max(ans,DP(i,j));
printf("Case %d: maximum height = %d\n",++kase,ans);
}
return 0;
}