对于每一个盒子,我们保存6分,分别表示不同的xyz。
之后就类似求最长子序列了
#include <cstdio>
#include <cstring>#include<algorithm>
#include <iostream>
using namespace std;
struct nodee
{
int a,b,c;
}node[1000];
int dp[1000];
bool cmp(nodee t1,nodee t2)
{
if(t1.a==t2.a)
return t1.b>t2.b;
return t1.a>t2.a;
}
int main()
{
int t;
int aa,bb,cc;
int zong=0;
while(scanf("%d",&t)!=EOF&&t)
{
zong++;
int cnt=0;
memset(dp,0,sizeof(dp));
for(int i=1;i<=t;i++)
{
cin>>aa>>bb>>cc;
node[cnt].a= aa;
node[cnt].b= bb;
node[cnt].c= cc;
cnt++;
node[cnt].a= aa;
node[cnt].b=cc;
node[cnt].c=bb;
cnt++;
node[cnt].a=bb;
node[cnt].b=aa;
node[cnt].c=cc;
cnt++;
node[cnt].a=bb;
node[cnt].b=cc;
node[cnt].c=aa;
cnt++;
node[cnt].a=cc;
node[cnt].b=aa;
node[cnt].c=bb;
cnt++;
node[cnt].a=cc;
node[cnt].b=bb;
node[cnt].c=aa;
cnt++;
}
sort(node,node+cnt,cmp);
int ans=-1;
for(int i=0;i<cnt;i++)
{
dp[i]=node[i].c;
for(int j=0;j<i;j++)
{
if(node[i].a<node[j].a&&node[i].b<node[j].b)
{
dp[i]=max(dp[i],dp[j]+node[i].c);
}
}
ans=max(ans,dp[i]);
}
cout<<"Case "<<zong<<": maximum height = "<<ans<<""<<endl;
}
}