聪明的大马猴

聪明的大马猴

时间限制: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;
}

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值