您的位置:首页 > 其它

UVa 437 - The Tower of Babylon

2013-06-15 18:43 429 查看
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 95;
int A[MAXN][3];
int n;
int m[MAXN][MAXN];
int d[MAXN];

int dp(int u)
{
int& cur = d[u];
if(cur > 0) return cur;
cur = A[u][2];
for(int v=0; v<MAXN; v++) if(m[u][v]){
int val = dp(v);
if(val+A[u][2] > cur) {
cur = val + A[u][2];
}
}
return cur;
}

int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int T=0;
while(scanf("%d", &n)==1 && n!=0) {
for(int i=0; i<n*3; i+=3) {
scanf("%d%d%d", &A[i][0], &A[i][1], &A[i][2]);
sort(A[i], A[i]+3);
memcpy(A[i+1], A[i], sizeof(A[i]));
swap(A[i+1][2], A[i+1][1]);
memcpy(A[i+2], A[i+1], sizeof(A[i]));
swap(A[i+2][2], A[i+2][0]);
}
n *= 3;
memset(m, 0, sizeof(m));
for(int i=0; i<n-1; i++) {
for(int j=1; j<n; j++) {
if(A[i][0] > A[j][0] && A[i][1]>A[j][1]) {
m[i][j] = 1;
} else if(A[i][0]<A[j][0] && A[i][1]<A[j][1]) {
m[j][i] = 1;
}
}
}
memset(d, 0, sizeof(d));
int max_val = 0;
for(int i=0; i<n; i++) {
int val = dp(i);
if(val > max_val) max_val = val;
}
printf("Case %d: maximum height = %d\n", ++T, max_val);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: