IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 经典动态规划——高楼扔鸡蛋(进阶版) -> 正文阅读

[数据结构与算法]经典动态规划——高楼扔鸡蛋(进阶版)

先看题目:

你?前有?栋从 1 到 N 共 N 层的楼,然后给你 K 个鸡蛋 ( K ?少为 1)。现在确定这栋楼存在楼层 0 <= F <= N ,在这层楼将鸡 蛋扔下去,鸡蛋恰好没摔碎(?于 F 的楼层都会碎,低于 F 的楼层都不 会碎)。现在问你,最坏情况下,你?少要扔?次鸡蛋,才能确定这个楼层 F 呢?
?

那么具体如何解决问题在扔鸡蛋初阶版已经给出:(https://blog.csdn.net/m0_46591995/article/details/118660350

那么今天解决的问题只有一个,那就是如何降低时间空间复杂度:如初阶版所说,降低复杂度的方法是先消除重叠子问题,没错,消除完子问题就已经可以较快速度的得出100以内的答案,但是算法复杂度仍然是指数级的。我们先看之前的代码片段:

int memo[max1][max1];
int dp1(int N,int K)//N为鸡蛋数目,K为楼层
{
    if(N==1) return K;
    if(K==0) return 0;
    int res = max1;
    if(memo[N][K]!=-1) return memo[N][K];
    for(int i = 1 ; i <= K ; i++)//!!!!
    {
        int temp;
        temp = max(dp1(N-1,i-1),dp1(N,K-i))+1;
        res = min(res,temp);

    }
    memo[N][K]=res;
    return res;
}

这边可以发现一个奇妙的地方,就是这个“for(int i = 1 ; i <= K ; i++)”的意义何在:

? ? ? 暴?穷举尝试在所有楼层 1 <= i <= N 扔鸡蛋,每次选择尝试次数最少
的那?层
那么意思也就是说我们在暴力枚举查找。
这样大家就能想到如何解决算法时间复杂度过大的问题了!
问题在于暴力枚举。。。那么查找算法中,最方便最快的查找算法是什么? 答:二分法查找
那么问题就清晰了:我们采用二分法来查找出符合实际问题的 i。
至于不熟悉具体二分法的实现各位铁铁们去翻翻大二上学期《数据结构与算法》这本必修考试课的书,里面将会有比我更为专业熟练的解释,这边之间给出算法实现:
int dp(int N,int K)//N为鸡蛋数目,K为楼层  运用二分法搜索优化
{
    if(N==1) return K;
    if(K==0) return 0;
    int res = max1;
    if(memo[N][K]!=-1) return memo[N][K];
    //for(int i = 1 ; i <= K ; i++)
    //{
    //    int temp;
    //    temp = max(dp(N-1,i-1),dp(N,K-i))+1;
     //   res = min(res,temp);
    //}
    int low = 1,high = K;
    while(low<=high)
    {
        int mid = (low+high)/2;
        int broken = dp(N-1,mid-1);//鸡蛋碎了
        int not_broken = dp(N,K-mid);//鸡蛋没碎
        if(broken > not_broken)//寻找碎与没碎哪一个跟大
        {
            high = mid-1;
            res = min(res,broken+1);
        }
        else{
            low = mid+1;
            res = min(res,not_broken+1);
        }

    }
    memo[N][K]=res;
    return res;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-15 16:28:07  更:2021-07-15 16:31:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:47:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码