题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069
思路:最长下降子序列
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int num=200;
struct node
{
int x,y,z;
}data[num];
int cnt,dp[num];
void add(int a,int b,int c)
{
data[cnt].x=a;
data[cnt].y=b;
data[cnt++].z=c;
}
bool cmp(const node a,const node b)
{
if(a.x!=b.x)
return a.x>b.x;
else if(a.y!=b.y)
return a.y>b.y;
else
return a.z>b.z;
}
int ok(int a,int b)
{
if(data[a].x>data[b].x&&data[a].y>data[b].y)
return 1;
return 0;
}
int main()
{
int n,i,j,a,b,c,cas=0,tmp,ans;
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
cnt=0;
cas++;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(a,c,b);
add(b,a,c);
add(b,c,a);
add(c,a,b);
add(c,b,a);
}
sort(data,data+cnt,cmp);
dp[0]=data[0].z;
for(i=1;i<cnt;i++)
{
tmp=0;
for(j=0;j<i;j++)
if(ok(j,i)&&dp[j]>tmp)
tmp=dp[j];
dp[i]=tmp+data[i].z;
}
ans=0;
for(i=0;i<cnt;i++)
if(dp[i]>ans)
ans=dp[i];
printf("Case %d: maximum height = %d\n",cas,ans);
}
return 0;
}