- 题目链接
- 解题思路:二维的最长上升子序列
- AC代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int x,y,z;
}a[200];
int dp[200];
bool cmp(node a,node b)
{
if(a.x==b.x)
return a.y>b.y;
else
return a.x>b.x;
}
int main()
{
int n,num=0;
while(~scanf("%d",&n)&&n)
{
int cnt=0;
memset(dp,0,sizeof(dp));
while(n--)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(x==y==z)
a[cnt].x=x,a[cnt].y=y,a[cnt++].z=z;
else if(x==y)
{
a[cnt].x=x,a[cnt].y=y,a[cnt++].z=z;
a[cnt].x=x,a[cnt].y=z,a[cnt++].z=y;
a[cnt].x=z,a[cnt].y=y,a[cnt++].z=x;
a[cnt].x=z,a[cnt].y=x,a[cnt++].z=y;
}
else if(x==z)
{
a[cnt].x=z,a[cnt].y=y,a[cnt++].z=x;
a[cnt].x=z,a[cnt].y=x,a[cnt++].z=y;
a[cnt].x=y,a[cnt].y=z,a[cnt++].z=x;
a[cnt].x=y,a[cnt].y=x,a[cnt++].z=z;
}
else if(y==z)
{
a[cnt].x=x,a[cnt].y=y,a[cnt++].z=z;
a[cnt].x=x,a[cnt].y=z,a[cnt++].z=y;
a[cnt].x=z,a[cnt].y=y,a[cnt++].z=x;
a[cnt].x=z,a[cnt].y=x,a[cnt++].z=y;
}
else
{
a[cnt].x=x,a[cnt].y=y,a[cnt++].z=z;
a[cnt].x=x,a[cnt].y=z,a[cnt++].z=y;
a[cnt].x=z,a[cnt].y=y,a[cnt++].z=x;
a[cnt].x=z,a[cnt].y=x,a[cnt++].z=y;
a[cnt].x=y,a[cnt].y=z,a[cnt++].z=x;
a[cnt].x=y,a[cnt].y=x,a[cnt++].z=z;
}
}
sort(a,a+cnt,cmp);
int ans=0;
for(int i=1;i<cnt;i++)
{
dp[i]=a[i].z;
for(int j=i-1;j>=0;j--)
{
if(a[j].x>a[i].x&&a[j].y>a[i].y)
{
dp[i]=max(dp[i],dp[j]+a[i].z);
}
}
ans=max(ans,dp[i]);
}
printf("Case %d: maximum height = %d\n",++num,ans);
}
return 0;
}