100层楼2个鸡蛋 - 动态规划

这篇博客介绍了如何运用动态规划来解决经典的智力问题——100层楼和2个鸡蛋。动态规划的关键在于定义转移函数res[i] = min{max{j, res[i - j] + 1}},并给出C代码实现,通过递归计算找出最少尝试次数。" 107168039,9067562,PTA链表逆转函数题解析,"['数据结构', '链表操作', '算法题', 'C语言编程', 'PTA平台']

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

原题及其它解法见:100层楼2个鸡蛋,以下为动态规划解法。


动态规划的关键在于写出转移函数,该题的转移函数为res[i] = min{max{j, res[i - j] + 1}}, 1<=j<=i。res[i] = x表示有i层楼,扔两个鸡蛋,最少需要x步测出临界楼层;j为扔第一个鸡蛋的楼层。

该转移函数的意思是,有i层楼,第一个鸡蛋扔在j层,碎了最多尝试j次,没碎问题又转化为:有i-j层,扔两个鸡蛋,最少尝试次数res[i-j]为多少。于是第一个鸡蛋扔在j层的最多尝试次数为max{j, res[i - j] + 1}。为了取一个最优的j,使得max{j, res[i - j] + 1}最小,就要尝试不同的取值1~i。

由于在计算res[i]时,需要知道res[0]~res[i - 1],因此需要从res[0]计算起,并将每一层的结果保留下来。


c代码如下:

#include <stdio.h>


int max(int a, int b)
{
    return a > b ? a : b;
}

int eggs(int n)
{
    // res[i] = x : 有i层楼,扔两个鸡蛋,最少需要x步测出临界楼层
    int* res = new int[n + 1]; 
    res[0] = 0;
    res[1] = 1;

    // 转移函数:res[i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值