动态规划
和最长不增子序列类似,注意底面的两边不可以是相同的
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
#include<algorithm>
#include<vector>
#include<string.h>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<sstream>
#include<time.h>
#include<utility>
#include<malloc.h>
#include<stdexcept>
using namespace std;
int n;
struct q
{
int x;
int y;
int z;
}p[1000];
int dp[1000];
bool cmp(q a ,q b)
{
if (a.x != b.x )
return a.x > b.x;
else
return a.y > b.y;
}
int k=1 ;
int x ,y,z;
int main()
{
while (scanf("%d",&n)!=EOF && n)
{
int len =1 ;
for (int i=1 ;i<=n;i++)
{
scanf("%d %d %d",&x ,&y ,&z);
p[len].x = x;
p[len].y = y;
p[len].z = z;
len ++;
p[len].x = x;
p[len].y = z;
p[len].z = y;
len ++;
p[len].x = y;
p[len].y = x;
p[len].z = z;
len ++;
p[len].x = y;
p[len].y = z;
p[len].z = x;
len ++;
p[len].x = z;
p[len].y = x;
p[len].z = y;
len ++;
p[len].x = z;
p[len].y = y;
p[len].z = x;
len ++;
}
sort (p+1,p+len,cmp);
memset(dp,0,sizeof(dp) );
for (int i=1 ;i<=len-1;i++)
{
dp[i] = p[i].z;
for(int j =1 ;j<=i;j++)
{
if ( p[j].x > p[i].x && p[j].y > p[i].y )
{
dp[i] = max (dp[i] , dp[j] + p[i].z);
}
}
}
int ans =0;
for (int i=1 ;i<=len-1;i++)
{
ans = max (ans ,dp[i]);
}
printf("Case %d: maximum height = %d\n",k++,ans);
}
return 0;
}