ZOJ - 1093 Monkey and Banana

探讨如何通过堆叠不同尺寸的积木帮助猴子拿到高处的香蕉。利用动态规划算法寻找最高的积木塔组合。

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

Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu

[]   [Go Back]   [Status]  

Description

A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, provide the monkey with some blocks. If the monkey is clever enough, it shall be able to reach the banana by placing one block on the top another to build a tower and climb up to get its favorite food.

The researchers have n types of blocks, and an unlimited supply of blocks of each type. Each type-i block was a rectangular solid with linear dimensions (xi, yi, zi). A block could be reoriented so that any two of its three dimensions determined the dimensions of the base and the other dimension was the height.

They want to make sure that the tallest tower possible by stacking blocks can reach the roof. The problem is that, in building a tower, one block could only be placed on top of another block as long as the two base dimensions of the upper block were both strictly smaller than the corresponding base dimensions of the lower block because there has to be some space for the monkey to step on. This meant, for example, that blocks oriented to have equal-sized bases couldn't be stacked.

Your job is to write a program that determines the height of the tallest tower the monkey can build with a given set of blocks.

Input Specification

The input file will contain one or more test cases. The first line of each test case contains an integer  n
representing the number of different blocks in the following data set. The maximum value for  n is 30. 
Each of the next  n lines contains three integers representing the values  xiyi and  zi
Input is terminated by a value of zero (0) for  n.

Output Specification

For each test case, print one line containing the case number (they are numbered sequentially starting from 1) and the height of the tallest possible tower in the format "Case  case: maximum height =  height"

Sample Input

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

Sample Output

Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342
 
  
 
  
 
  
 
  
简单的dp题。
 
  
分析:因为每块积木最多有3个不同的底面和高度,因此先把每块积木看成三种不同的积木,每种积木只有一个底面和一个高度。n种类型的积木转化为3*n个不同的积木的叠加,对这3 * n个积木的长边从大到小排序;接下来的问题就是找到一个递减的子序列,使得子序列的高度和最大即可。


数组dp:dp[i]表示是以第i块积木为顶的塔的最大高度


因此可得状态转移方程:dp[i] = max(dp[i],dp[j] + r[i].z)(满足积木j的底面长和宽都大于积木i的长和宽)
 
  
 
  
 
  
 
  
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
struct R
{
    int x,y,z;
}r[100];
int dp[100];
bool cmp(const R a,const R b)
{
    if(a.x==b.x) return a.y>b.y;
    else return a.x>b.x;
}
int DP()
{
    int maxh=0,i,j;
    sort(r,r+n,cmp);
    for(i=0;i<n;i++)
    {
        dp[i]=r[i].z;
        for(j=i-1;j>=0;j--)
            if(r[j].x>r[i].x&&r[j].y>r[i].y)
            if(dp[j]+r[i].z>dp[i])
            dp[i]= dp[j]+r[i].z;
        maxh=maxh>dp[i]?maxh:dp[i];
    }
    return maxh;
}


int main()
{
    int i,j,a,b,c,kase=0;
    while(scanf("%d",&n)&&n!=0)
    {
        for(i=0,j=0;i<n;i++)
        {
           scanf("%d%d%d",&a,&b,&c);
           r[j].x=min(a,b);
           r[j].y=max(a,b);
           r[j].z=c;
           r[j+1].x=min(a,c);
           r[j+1].y=max(a,c);
           r[j+1].z=b;
           r[j+2].x=min(b,c);
           r[j+2].y=max(b,c);
           r[j+2].z=a;
           j+=3;
        }
        n=j;
        printf("Case %d: maximum height = %d\n",++kase,DP());
    }
    return 0;
}




 
 
Windows 系统修复工具主要用于解决 Windows 11/10 系统中的各种常见问题,具有操作简单、功能全面等特点: 文件资源管理器修复:可解决文件资源管理器卡死、崩溃、无响应等问题,能终止崩溃循环。还可修复右键菜单无响应或选项缺失问题,以及重建缩略图缓存,让图片、视频等文件的缩略图正常显示,此外,还能处理桌面缺少回收站图标、回收站损坏等问题。 互联网和连接修复:能够刷新 DNS 缓存,加速网页加载速度,减少访问延迟。可重置 TCP/IP 协议栈,增强网络连接稳定性,减少网络掉线情况,还能还原 Hosts 文件,清除恶意程序对网络设置的篡改,保障网络安全,解决电脑重装系统后网络无法连接、浏览器主页被篡改等问题。 系统修复:集成系统文件检查器(SFC),可自动扫描并修复受损的系统文件。能解决 Windows 激活状态异常的问题,还可重建 DLL 注册库,恢复应用程序兼容性,解决部分软件无法正常运行的问题,同时也能处理如 Windows 沙箱无法启动、Windows 将 JPG 或 JPEG 保存为 JFIF 等系统问题。 系统工具维护:提供启动管理器、服务管理器和进程管理器等工具,用户可控制和管理启动程序、系统服务和当前运行的进程,提高系统的启动和运行速度,防止不必要的程序和服务占用系统资源。还能查看系统规格,如处理器线程数、最大显示分辨率等。 故障排除:集成超过 20 个微软官方诊断工具,可对系统问题进行专业排查,还能生成硬件健康状态报告。能解决搜索和索引故障、邮件和日历应用程序崩溃、设置应用程序无法启动等问题,也可处理打印机、网络适配器、Windows 更新等相关故障。 其他修复功能:可以重置组策略设置、catroot2 文件夹、记事本等多种系统设置和组件,如重置 Windows 应用商店缓存、Windows 防火墙设置等。还能添加重建图标缓存支持,恢复粘滞便笺删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值