题目大意:给定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];
}
}