hdu 1069 简单动态规划

http://acm.hdu.edu.cn/showproblem.php?pid=1069

/*

题目大意:给出n种类型的木块,求用这些木块可以堆起的最大高度,要求上边的木快的长和宽都要严格小于下边。

*/

#include<stdio.h>
#include<stdlib.h>
#define N 95
int f[N];  //f[N]记录加上第i个木块后的最大高度
struct X
{
	int x,y,z;
}block[N];
int cmp(const struct X* a,const struct X* b)
{
	if((*a).x!=(*b).x)
		return (*a).x-(*b).x;
	else
		return (*a).y-(*b).y;
}
int main()
{
	int T,n,a,b,c,i,j,temp,tallest;
	T=1;
	while(scanf("%d",&n),n){
		for(i=0,j=0;j<n;j++){       //每种木块可以有三种放法
			scanf("%d%d%d",&a,&b,&c);
			block[i].x=a; block[i].y=b; block[i].z=c;
			block[i+1].x=a; block[i+1].y=c; block[i+1].z=b;
			block[i+2].x=c; block[i+2].y=b; block[i+2].z=a;
			i+=3;
		}
		for(i=0;i<n*3;i++){          //找出每种木块的长和宽
			if(block[i].x<block[i].y){
				temp=block[i].x;
				block[i].x=block[i].y;
				block[i].y=temp;
			}
		}
		qsort(block,n*3,sizeof(block[0]),cmp); //先按木块的"长"升序排列,"长"相等时再按"宽"升序排列
		for(i=0,tallest=0;i<3*n;i++){    //将f[i]初始化为第i个的高度,计算f[i]时,遍历0—>i,找出放上第i个木块时的最大高度。
			f[i]=block[i].z;
			for(j=0;j<=i;j++){
				if(block[i].x>block[j].x&&block[i].y>block[j].y){
					f[i]=max(f[i],f[j]+block[i].z);
				}
				tallest=max(tallest,f[i]);
			}
		}
		printf("Case %d: maximum height = %d\n",T++,tallest);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值