题目链接:
https://vjudge.net/problem/UVA-437
题意:
题解:
dp[i][j]:=考虑到前i个立方体并且第i个立方体以标号为j为高的最大值
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MS(a) memset(a,0,sizeof(a))
#define MP make_pair
#define PB push_back
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
inline ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
//////////////////////////////////////////////////////////////////////////
const int maxn = 1e5+10;
int n;
int block[40][3],d[40][3];
void get(int* v,int b,int x){
int idx = 0;
for(int i=0; i<3; i++)
if(i!=x)
v[idx++] = block[b][i];
}
int dp(int i,int j){
if(d[i][j] >= 0) return d[i][j];
d[i][j] = 0;
int v[2],v2[2];
get(v,i,j);
for(int a=0; a<n; a++){
for(int b=0; b<3; b++){
get(v2,a,b);
if(v[0]>v2[0] && v[1]>v2[1])
d[i][j] = max(d[i][j],dp(a,b));
}
}
d[i][j] += block[i][j];
return d[i][j];
}
int main(){
int cas = 0;
while(scanf("%d",&n) && n){
for(int i=0; i<n; i++){
scanf("%d%d%d",&block[i][0],&block[i][1],&block[i][2]);
sort(block[i],block[i]+3);
}
int ans = -INF;
memset(d,-1,sizeof(d));
for(int i=0; i<n; i++)
for(int j=0; j<3; j++)
ans = max(ans,dp(i,j));
printf("Case %d: maximum height = %d\n",++cas,ans);
}
return 0;
}