找DP的状态定义到底缺什么?

  • 前言
  • 一、带手续的买卖股票
  • 二、贪心 & DP + 贪心
    • 1、贪心
    • 2、DP + 贪心
  • 总结
  • 参考文献

前言

贪心考察逻辑分析能力 & 抽象问题能力,动态规划也是一样,如何将问题转化为更小规模但性质相同的问题,真的很考察抽象问题能力,不抽象出来,给人的感觉就是有无数种复杂的可能,无法着手做题!

一、带手续的买卖股票

二、贪心 & DP + 贪心

1、贪心

// 买股票的最佳时机。
public class MaxProfit {/*贪心点:先手持该支股票,因为卖掉股票需要花费手续费fee,所以手持股票的价格就是买入价格 + fee.当碰到价格比这个高的时候就卖了,赚钱,但是后面可能价格更高,局部拿不到最优解,那就把此时卖掉的价格当成过度价格,后面更高的价格就直接取差价当收益。当碰到比手持股票价格 - fee 还低的时机时,拿肯定不要前面买那一次,毕竟到这个低点时都赚不到钱,不如手持这个更低的股票价格。当碰到比手持股票价格低,但有比手持股票价格 - fee高,则不管,毕竟卖了不仅是不赚钱,还要亏钱。注:相当于把问题转换为手续费为0的卖股票,当且仅当买股票时把手续费先算上,就0手续费 + 不做亏钱买卖。贪心最考察抽象能力:其实什么时候买和卖不重要,重要的是最大利益是多少。*/public int maxProfit(int[] prices, int fee) {int buy = prices[0] + fee;int profit = 0;for (int i = 1; i < prices.length; i++) {if (prices[i] + fee < buy) {buy = prices[i] + fee;} else if (prices[i] > buy) {profit += prices[i] - buy;// 后面的不要手续。buy = prices[i];}// 继续寻找可以卖的时机。}return profit;}
}

2、DP + 贪心

// 一题多解,动态规划 + 贪心,将大问题转换为相同性能但规模更小的子问题递进。
class MaxProfit2 {// 以天为时间线,最后一天不持有股票的收益 为 max(前一天不持有股票,前一天持有股票今天卖了)(贪心体现)public int maxProfit(int[] prices, int fee) {int n = prices.length;int[][] f = new int[n][2];//1-状态定义f[0][1] = -prices[0];//2-初始化for (int i = 1; i < n; i++) {//3-状态转移f[i][0] = Math.max(f[i - 1][0], f[i - 1][1] + prices[i] - fee);f[i][1] = Math.max(f[i - 1][1], f[i - 1][0] - prices[i]);}return f[n - 1][0];//4-最终状态}// 状压public int maxProfit2(int[] prices, int fee) {int n = prices.length;int[] f = new int[2];f[1] = -prices[0];for (int i = 1; i < n; i++) {int old = f[0];f[0] = Math.max(old, f[1] + prices[i] - fee);f[1] = Math.max(f[1], old - prices[i]);}return f[0];}/*review:1-为什么我知道DP是应用在大问题分解相同性质小规模问题上,也知道DP四要素(状态定义/状态递进/初始状态/最终状态),却想不到状态的定义,或者说无法将问题抽象出来。A)DP做少了无题感;B)没有抓住关键线--循环线,DP一般为一层/两层/三层循环来改变状态,那么循环就得有条循环线,如按时间,如该题按天数,第i天。一个len = n的数组,要求到达最后一天的收益,是否可以先求前n-1的收益?*/
}

总结

1)贪心/DP真的很考察问题抽象能力,不抽象会感觉到问题的模拟复杂性。
2)抽象就要抓主干问题是什么,其他不需要的信息不要携带。
3)知道DP是应用在大问题分解相同性质小规模问题上,也知道DP四要素(状态定义/状态递进/初始状态/最终状态),却想不到状态的定义,或者说无法将问题抽象出来?
A)DP做少了无题感;
B)没有抓住关键线–循环线,DP一般为一层/两层/三层循环来改变状态,那么循环就得有条循环线,如按时间,如该题按天数,第i天。
4)DP的状态含义就是问题所求,如该题的最大利益;而DP数组的每个变量所在位置,则表示该最大利益发生在什么时候。总结:什么时候 & 什么状态。

参考文献

[1] LeetCode 买卖股票的最佳时机含手续费

带手续费买卖股票的最大利益[找DP的状态定义到底缺什么?]相关推荐

  1. <LeetCode天梯>Day004 买卖股票的最佳时机 II(DP动态规划法) | 初级算法 | Python

    今天1024程序员节,车神哥在这里恭祝各位节日快乐,发量惊人,财务自由,从不加班!!!~ 今天依旧和车神哥一起来提升自己的Python编程和面试能力吧,刷天梯~ 以下为我的天梯积分规则: 每日至少一题 ...

  2. 力扣-309最佳买卖股票时机含冷冻期(dp)

    力扣-309最佳买卖股票时机含冷冻期 1.题目 309. 最佳买卖股票时机含冷冻期 给定一个整数数组prices,其中第 prices[i] 表示第i天的股票价格 . 设计一个算法计算出最大利润.在满 ...

  3. leetcode 123. 买卖股票的最佳时机 III(dp)

    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的 ...

  4. leetcode 188. 买卖股票的最佳时机 IV(dp)

    给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意:你不能同时参 ...

  5. 买卖股票的最佳时机(分治,dp)

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...

  6. 【leetcode买卖股票系列问题】多次买卖/手续费/冻结期

    一.目录 一.目录 二.股票系列问题 1.买卖股票的最佳时机(121题) 1.1.题目 1.2.思路 1.3.代码实现(1种) 2.买卖股票的最佳时机II(122题) 2.1.题目 2.2.思路 2. ...

  7. 笔记1 第13课 动规2 ——买卖股票最佳时机,打家劫舍,零钱找兑——极客时间算法

    之前收藏了极客时间的算法训练营3期 共21课,计划每一课写博客来记录学习,主要形式为 方法类型1 题1 题解 题2 题解 方法类型2 题1 题解 -- 题目大体来自leetcode 和 acwing ...

  8. 算法训练第五十一天 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费、股票问题总结

    动态规划part12 309.最佳买卖股票时机含冷冻期 题目描述 思路 总结 714.买卖股票的最佳时机含手续费 题目描述 思路 股票问题总结 309.最佳买卖股票时机含冷冻期 题目链接:309.最佳 ...

  9. 【第51天| 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 】

    309.最佳买卖股票时机含冷冻期 三个状态: 1. 当前持有股票状态1 2. 当前不持有股票,且不是今天卖出的股票状态2 3. 当前不持有股票, 且股票是今天卖出的状态3 题目要求前一天卖出了股票今天 ...

  10. [Leetcode] 买卖股票合集(动态规划)

    写完这套题,再搞一台时光机,财务自由不是梦(Doge) ================================== 相关题目链接 121 买卖股票的最佳时机 122 买卖股票的最佳时机 II ...

最新文章

  1. 机器人水库涵洞检测_能给眼睛打针、可水下搜索救援,手术机器人水下机器人将亮相服贸会...
  2. 【UML 建模】UML建模语言入门-视图,事物,关系,通用机制
  3. linux 下 gcc o2优化可能出现的问题
  4. boost::safe_numerics模块实现测试添加 constexpr
  5. MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片
  6. 一文搞懂ThreadLocal及相关的内存泄露问题
  7. web.xml.jsf_看一下即将发布的JSF 2.3 Push支持
  8. Rand函数使用和对补码的理解
  9. git 分支的创建和切换
  10. 如何编写一个d.ts文件
  11. mysql case默认_MySQL数据库架构和同步复制流程
  12. quartus仿真30:D触发器构成的可重复序列111探测器
  13. Python解释器配置设置
  14. 工程数学线性代数 同济大学版 第六版 课后习题答案 高等数学 大学数学 线性代数 课后题答案与解析 考试复习提纲
  15. canvas教程17-合成
  16. 【IoU loss】IoU损失函数理解
  17. MinGW和MSYS简介
  18. ajax传递数组参数
  19. 一种快速的幂运算方法(底数是自然数e,指数是浮点数)
  20. 绿盟科技网络安全威胁周报2017.15 建议关注方程式组织泄漏大量针对Windows攻击工具...

热门文章

  1. 去重插入数据 mysql_mysql 数据去重
  2. Selenium与phantomjs安装与环境配置,以及易班网站模拟登陆操作
  3. 2022年北京购房攻略二 (城区交通篇)
  4. 为何我的孩子不沉迷网络游戏
  5. 球体弹性碰撞位置和速度计算算法
  6. 硕士毕业论文奇偶页眉页脚的设置
  7. TPU 使用TPU训练tensorflow初探(Colab)
  8. 2022年伊始,IT圈还有这些事是你不知道的?
  9. 动词记忆(1):ate,ify,ish后缀常用词
  10. 【毕业设计--开题报告】论文开题报告常见问题:参考论文格式,visio画箭头,wps段落设置