聪明的大马猴
时间限制:1秒 内存限制:32M
题目描述
大马猴喜欢吃香蕉,大马猴在小时候摔断了腿,不能爬树了,所以大马猴现在每天都在为了吃到树上的香蕉而努力。幸亏身体残疾的大马猴还有一个非常聪明的脑子,他学会了一个技能——板砖!所以他有一个非常响亮的外号:搬砖大马猴!
今天天气非常晴朗,大马猴又想吃香蕉,他使用自己搬砖的技巧,将地上一个一个的长方体的砖搭建在一起(只能是一个砖放到另一个砖上搭建,并且两个砖接触面的表面积有以下关系:下面的砖的顶层表面积严格大于上面的砖的底层表面积,并且底面的长和宽要严格大于上面砖的长和宽),大马猴由于昨天吃香蕉时把脑子摔坏了, 今天不会搬砖了,请你帮帮他把。
注意砖是可以通过旋转调整底层或者顶层表面积,并且每个砖都有无数个。
输入描述
多个测试用例
每个测试用例的第一行包含一个整数n,表示砖的数量,接下来的n行中的每行包含三个表示值xi,yi和zi的整数。
输入以n的零(0)值终止。
输出描述
对于每个测试用例,输出能到达的最大高度。
样例
输入
1 10 20 30 2 6 8 10 5 5 5 7 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 5 31 41 59 26 53 58 97 93 23 84 62 64 33 83 27 0输出
40 21 28 342
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=35*6;
int n;
struct node{
int x;
int y;
int z;
}a[N];
bool cmp(node X,node Y){
if(X.x!=Y.x) return X.x>Y.x;
else return X.y>Y.y;
}
void ins(int xi,int yi,int zi,int idx){
a[idx].x=xi;
a[idx].y=yi;
a[idx].z=zi;
return;
}
int max_dp(){
int dp[N],ans=0;
for(int i=1;i<=n;i++){
dp[i]=a[i].z;
for(int j=1;j<i;j++){
if(a[j].x>a[i].x&&a[j].y>a[i].y&&dp[i]<dp[j]+a[i].z){
dp[i]=dp[j]+a[i].z;
}
}
ans=max(ans,dp[i]);
}
return ans;
}
int main(){
while(cin>>n){
if(!n) break;
n*=6;
for(int i=1;i<=n;){
int xi,yi,zi;
scanf("%d %d %d",&xi,&yi,&zi);
ins(xi,yi,zi,i++);
ins(xi,zi,yi,i++);
ins(yi,xi,zi,i++);
ins(yi,zi,xi,i++);
ins(zi,xi,yi,i++);
ins(zi,yi,xi,i++);
}
sort(a+1,a+n+1,cmp);
printf("%d\n",max_dp());
}
return 0;
}