| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> ??思维导图整理大厂面试高频数组21: 股票问题+冷冻期的两种dp数组定义方式 力扣309?? -> 正文阅读 |
|
[数据结构与算法]??思维导图整理大厂面试高频数组21: 股票问题+冷冻期的两种dp数组定义方式 力扣309?? |
0.导图整理1.两个状态的动态规划1.1 两个状态的思想本题就是在 股票II买卖多次 的基础上增加了冷冻期的条件, dp数组定义过程基本相似, 大家可以先看完上面的题解, 再来看本题题解. 大家在看其他题解的时候, 肯定大部分都是三个状态的动态规划解法, 这种解法也确实符合一般的思路, 毕竟前面几题我们大多都定义的两个状态: 持有have[i]和不持有no[i]股票, 现在多了个冷冻期的附加条件, 那自然想到再多加一个状态单独表示冷冻期的情况. 但总感觉这样的三个状态和前面几题就不统一了, 那么能不能还用两个状态解决此题呢? 我们首先观察下冷冻期的概念, 它是在股票卖出之后才会出现的情况, 也就是说处于冷冻期时一定是不持有股票的, 所以可以将它合并到状态no[i]中, 这样就将三个状态成功转化为两个状态了. 1.2 递推公式的变化状态定义完了, 就是递推公式的推导了, 根据之前的经验, 递推公式由四种情况组合而成, 而这四种情况中和冷冻期有关的就只有 第i天买入股票 的情况了, 其他的三种状态都和冷冻期关系不大, 并未受太大影响, 递推公式也没什么变化. 下面我们就来着重分析这种情况, 当第i天买入股票时, 那第i-1天必定是不持有股票且不能是冷冻期, 而只用no[i-1]这个状态并不能区别出是否为冷冻期, 所以这里我们采用no[i-2]这个状态. 现在我们来说明这个状态的合理性: no[i-2]由两种情况组成:
综合上述两种情况, 无论no[i-2]是由哪个情况转移而来, 第i天都不是冷冻期. 1.3 no[i-2]是否为最大利润上述说明了使用了no[i-2]的合理性, 那么就剩最后一个问题了, 我们跳过了no[i-1]这个状态, 那么no[i-2]是否就是当前的最大利润呢? 这里还是用上述no[i-2]的两种情况来说明:
综合两种情况来看, no[i-2]就是当前的最大利润, 这点理解之后, 递推公式就没什么难度了. 1.4 初始化的不同之前都是初始化了have[0]和no[0]两个状态就可以了, 本题由于使用到了no[i-2]这个状态, 在i=1时是不合法的, 所以本题还要初始化have[1]和no[1]两个状态, 根据递推公式就可以了, 也没什么难度, 就是麻烦了一点. 1.5 空间优化的难点本题在空间优化上是有点难度的, 因为我们需要用到no[i-2]的状态, 所以必须用变量同时存储no[i-2]和no[i-1]的状态, 变量记录的位置要确定好, 具体实现可以看最后的代码. 2.三个状态的动态规划上文提到了最常规的思想就是在两个状态的基础上再新增一个状态用来表示冷冻期, 当然no[i]的含义也发生了一点的变化
定义了这三个状态之后, 根据之前的经验, 状态转移方程也不难写出, 如下: 这里的have[i]没有变化, cold[i]也很容易写出, 唯一变化较大的就是no[i]了, 可能有人会感觉当天卖出股票也是满足的, 因为到第二天才会是冷冻期. 官方题解的解释是f[i]表示第 i 天结束之后的「累计最大收益」, 这种定义方式确实解决了这个问题, 但理解起来有点麻烦, 感觉绕了一下, 而且这种定义方式和之前的股票问题就有了差距, 不方便将它们整合起来, 所以我的理解是 只要卖出了股票就处于冷冻期, 不一定非要等到第二天, 这样来理解, 问题就容易想清楚了. 源码Python:
java:
我的更多精彩文章链接, 欢迎查看 各种电脑/软件/生活/音乐/动漫/电影技巧汇总(你肯定能够找到你需要的使用技巧) 力扣算法刷题 根据思维导图整理笔记快速记忆算法重点内容(欢迎和博主一起打卡刷题哦) 计算机专业知识 思维导图整理 最值得收藏的 Python 全部知识点思维导图整理, 附带常用代码/方法/库/数据结构/常见错误/经典思想(持续更新中) 最值得收藏的 C++ 全部知识点思维导图整理(清华大学郑莉版), 东南大学软件工程初试906科目 最值得收藏的 计算机网络 全部知识点思维导图整理(王道考研), 附带经典5层结构中英对照和框架简介 最值得收藏的 算法分析与设计 全部知识点思维导图整理(北大慕课课程) 最值得收藏的 数据结构 全部知识点思维导图整理(王道考研), 附带经典题型整理 最值得收藏的 人工智能导论 全部知识点思维导图整理(王万良慕课课程) 最值得收藏的 数值分析 全部知识点思维导图整理(东北大学慕课课程) 最值得收藏的 数字图像处理 全部知识点思维导图整理(武汉大学慕课课程) 红黑树 一张导图解决红黑树全部插入和删除问题 包含详细操作原理 情况对比 各种常见排序算法的时间/空间复杂度 是否稳定 算法选取的情况 改进 思维导图整理 人工智能课件 算法分析课件 Python课件 数值分析课件 机器学习课件 图像处理课件 考研相关科目 知识点 思维导图整理 考研经验–东南大学软件学院软件工程(这些基础课和专业课的各种坑和复习技巧你应该知道) 东南大学 软件工程 906 数据结构 C++ 历年真题 思维导图整理 最值得收藏的 考研高等数学 全部知识点思维导图整理(张宇, 汤家凤), 附做题技巧/易错点/知识点整理 最值得收藏的 考研线性代数 全部知识点思维导图整理(张宇, 汤家凤), 附带惯用思维/做题技巧/易错点整理 考研思修 知识点 做题技巧 同类比较 重要会议 1800易错题 思维导图整理 考研近代史 知识点 做题技巧 同类比较 重要会议 1800易错题 思维导图整理 考研马原 知识点 做题技巧 同类比较 重要会议 1800易错题 思维导图整理 考研数学课程笔记 考研英语课程笔记 考研英语单词词根词缀记忆 考研政治课程笔记 Python相关技术 知识点 思维导图整理 Numpy常见用法全部OneNote笔记 全部笔记思维导图整理 Pandas常见用法全部OneNote笔记 全部笔记思维导图整理 Matplotlib常见用法全部OneNote笔记 全部笔记思维导图整理 PyTorch常见用法全部OneNote笔记 全部笔记思维导图整理 Scikit-Learn常见用法全部OneNote笔记 全部笔记思维导图整理 Java相关技术/ssm框架全部笔记 科技相关 小米手机 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/26 8:46:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |