感觉UVA上的入门经典DP这块不是LCS就是LIS。
这个题是LIS,1Y。
没有想太多,对于每次输入的x,y,z,我都构造了3!=6种的形态。
分别依照x,y,z降序排序,然后再进行LIS动规。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
struct Block
{
int x,y,z;
};
bool cmp(Block a,Block b)
{
if(a.x==b.x)
{
if(a.y==b.y) return a.z<b.z;
else return a.y<b.y;
}
return a.x<b.x;
}
Block p[200];
int dp[200];
int main()
{
int n,kase=0;
while(scanf("%d",&n)&&n)
{
int x,y,z;
int N=0;
memset(dp,0,sizeof(dp));
for(int i=0; i<n; ++i)
{
scanf("%d%d%d",&x,&y,&z);
p[N].x=x;p[N].y=y;p[N].z=z;N++;
p[N].x=x;p[N].y=z;p[N].z=y;N++;
p[N].x=y;p[N].y=z;p[N].z=x;N++;
p[N].x=y;p[N].y=x;p[N].z=z;N++;
p[N].x=z;p[N].y=x;p[N].z=y;N++;
p[N].x=z;p[N].y=y;p[N].z=x;N++;
}
sort(p,p+N,cmp);
int ans=0;
for(int i=N-1; i>=0; --i)
{
int mx=0;
for(int j=i+1; j<N; ++j)
if(p[i].x<p[j].x&&p[i].y<p[j].y&&dp[j]>mx)
mx=dp[j];
dp[i]=mx+p[i].z;
ans=max(ans,dp[i]);
}
printf("Case %d: maximum height = %d\n",++kase,ans);
}
return 0;
}