UVA 437 The Tower of Babylon

本文介绍了一种基于三维形体堆叠的算法实现过程,通过动态规划来寻找最高堆叠高度。该算法首先对每个形体进行排序,并尝试所有可能的放置方式,通过递归调用动态规划函数计算最大高度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
//状态定义:d[idx][h] 
//现在是序列为idx的长方体,高h在idx中第几个 最多还能有多高(包括当前这个立方体) 
int blocks[35][3],d[35][3],N;
int dp(int idx,int h)
{

	int& ans=d[idx][h];
	if(ans) return ans;
	ans=0;    
	
	int p=0,v[2];  //v为现在长宽; 
	for(int i=0;i<3;i++) 
	if(i!=h) v[p++]=blocks[idx][i];
	
	for(int i=0;i<N;i++)
	{
		int v2[3]; //v2为准备放上去的 
		memcpy(v2,blocks[i],sizeof(v2));
		do{
			if(v2[0]<v[0]&&v2[1]<v[1]) {
				int h1=find(blocks[i],blocks[i]+3,v2[2])-blocks[i];
				ans=max(ans,dp(i,h1));
			}
		}while(next_permutation(v2,v2+3));
	}
	ans+=blocks[idx][h];  //加上当前这一层的高度 
	return ans;
}
int main()
{
	int kase=0;
	while(scanf("%d",&N)&&N)
	{
		for(int i=0;i<N;i++)
		{
			for(int j=0;j<3;j++) 
			cin>>blocks[i][j];
			sort(blocks[i],blocks[i]+3);
		}
		
		
		int ans=0;
		memset(d,0,sizeof(d));
		for(int i=0;i<N;i++) 
		for(int h=0;h<3;h++)
			ans=max(ans,dp(i,h));
			
		printf("Case %d: maximum height = %d\n",++kase,ans);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值