题意:给你n种石头,长x,宽y,高z,每种石头数目无限,一块石头能放到另一块上的条件是:长和宽严格小于下面的石头。问叠起来的最大高度。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=200;
struct node
{
int x,y,z;
void fun(int a,int b,int c){x=a;y=b;z=c;}
}stone[N];
int cnt,imax,map[N],dp(int);
void fun(int,int,int);
int main()
{
int n,t_cnt=0;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
cnt=0;imax=0;
memset(map,0,sizeof(map));
for(int i=0;i<n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
fun(a,b,c);
}
for(int i=0;i<cnt;i++)
{
imax=max(imax,dp(i));
}
printf("Case %d: maximum height = %d\n",++t_cnt,imax);
}
}
void fun(int a,int b,int c)
{
stone[cnt++].fun(a,b,c);
stone[cnt++].fun(b,a,c);
stone[cnt++].fun(a,c,b);
stone[cnt++].fun(c,a,b);
stone[cnt++].fun(b,c,a);
stone[cnt++].fun(c,b,a);
}
int dp(int pos)
{
if(map[pos]!=0) return map[pos];
else
{
for(int i=0;i<cnt;i++)
{
if(i==pos) continue;
if(stone[pos].x<stone[i].x&&stone[pos].y<stone[i].y)
{
map[pos]=max(map[pos],dp(i)+stone[pos].z);
}
}
map[pos]=max(map[pos],stone[pos].z);
return map[pos];
}
}