动态规划的算法本质

  • 本质上就是穷举状态,然后在选择中选择最优解
  • 你只要记住状态选择两个词即可


以上面的题目为例子

穷举框架

dp[i][k][0 or 1]
0 <= i <= n - 1, 1 <= k <= K
n 为天数,大 K 为交易数的上限,0 和 1 代表是否持有股票。
此问题共 n × K × 2 种状态,全部穷举就能搞定。for 0 <= i < n:for 1 <= k <= K:for s in {0, 1}:dp[i][k][s] = max(buy, sell, rest)

状态转移框架

  • 持有状态的状态转移图片

  • 其实后一天的股票盈利模式都是由前一天得到的,可以在前一天的基础上来得到的

121.买卖股票的最佳时机 I


重点在某一天选择买入这只股票,并选择在未来某一个不同的日子卖出该股票。是书写状态转移方程的关键!

代码实现

class Solution {public int maxProfit(int[] prices){// 对于状态转移来讲,最关键是搞出状态转移方程int n = prices.length;// 创建dp数组用于存储状态转移方程int[][] dp = new int[n][2];// 循环进行状态转移变换for(int i = 0; i < n; i++){if(i - 1 == -1){// 基本的状态转移方程dp[i][0] = 0;   // 刚开始表示没有持有股票,dp[i][1] = -prices[i]; // 为1的时候肯定是持有股票,还没有将股票卖出// 为了提高效率,肯定是需要在进行本轮赋值结束以后,使用continue终止本轮 i - 1 == -1 的操作continue;}// 并不是在if条件的反面才进行状态转移方程的书写dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]); // 前一天没有 以及 前一天拥有并卖出进行比较dp[i][1] = Math.max(dp[i-1][1], -prices[i]); //  dp[i-1][0] 因为没有持有肯定为0}// 要想净值最大,肯定是看在最后一天,且股票已经卖出状态下的值return dp[n-1][0];}
}

122 买卖股票的最佳时机 II


***重点:***任何时候最多只能持有一股股票,同一天可以进行购买并出售

代码实现

class Solution {public int maxProfit(int[] prices) {// 可以使用动态规划,状态转移方程来进行书写int n = prices.length;int[][] dp = new int[n][2];for(int i = 0; i < n; i++){if(i - 1 == -1){dp[i][0] = 0;dp[i][1] = -prices[i]; // 1表示现在已经买了continue;}dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]); // 当天的股票和前一天的两种情况进行相应比较即可dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] - prices[i]); //  dp[i-1][0] - prices[i]前一天没有股票,后一天有股票,表示已经买了股票了}return dp[n-1][0];}
}

123.买卖股票的最佳时机 III


代码实现

class Solution {public int maxProfit(int[] prices) {// 理解题目的意思,这里的k的定义并不是(已进行的交易次数),而是最大交易次数的上线限制// 如果确定今天进行一次交易,要保证截止今天最大交易次数上限为k,那么昨天的最大交易次数上线为 k-1int max_k = 2;int n = prices.length;int[][][] dp = new int[n][max_k + 1][2];// 内容都是一样的for(int i = 0; i < n; i++){for(int k = max_k; k > 0; k--){// baseif(i - 1 == -1){dp[i][k][0] = 0;dp[i][k][1] = -prices[i]; // 第一天拥有的话,肯定是将股票进行买入了continue;}// 进行状态转移方程更新dp[i][k][0] = Math.max(dp[i-1][k][0], dp[i-1][k][1] + prices[i]);  // 前一天有k次,但是都已经卖出去了dp[i][k][1] = Math.max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i]); // 前一天没有,经过购买股票,使得后一天就有了}}return dp[n-1][max_k][0]; // 通过循环来进行比较也清楚最后肯定是在n-1处}
}

动态规划 - 买卖股票相关推荐

  1. 动态规划-买卖股票的最佳时机 专题

    动态规划-买卖股票的最佳时机 专题 买卖股票的最佳时机(可以用贪心) 力扣题目链接 因为只能买卖一次. dp[i][j]数组的含义:第 i 天状态为 j 时的最大现金. 递推公式: 设dp[i][0] ...

  2. 动态规划---买卖股票的最佳时机

    说明 股票问题算是动态规划问题中的一个小分支,这里单独写一篇文章介绍.至于动态规划基础问题和详细的处理步骤我在我的另一篇文章中详细介绍过.具体解决步骤请移步观看--动态规划基础篇.如果想了解01背包问 ...

  3. 动态规划——买卖股票的最优时机含手续费(Leetcode 714)

    题目选自​​​​​​Leetcode 714. 买卖股票的最佳时机含手续费 本题和 122. 买卖股票的最佳时机 II 是非常类似的题,唯一的区别就在于本题有「手续费」而第 122 题没有. 问题描述 ...

  4. 动态规划——买卖股票的最好时机(Leetcode 121)

    题目选自Leetcode 121. 买卖股票的最佳时机 提示:股票系列问题有共通性,但难度较大,初次接触此类问题的话很难看懂下述思路,建议直接看labuladong大神的题解 题目描述: 解题思路: ...

  5. 贪心/动态规划 - 买卖股票的最佳时机含手续费

    题目链接 贪心 每次只能交易一个股票,最优的选择就是低买高卖.不过每次交易股票都有一次手续费.可以把手续费算到买入的价格里.只要能收益就交易. 每次卖出一个股票就拥有了原价购买股票的机会.这样就能在具 ...

  6. 动态规划——买卖股票的最佳时机含手续费

    题目 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每笔交易都需要付手续费.如果你已经购买 ...

  7. 动态规划 - 买卖股票的最佳时机 IV

    题目链接 使用两个辅助数组 buy[i][j]buy[i][j]buy[i][j]表示前iii个股票发生jjj次交易且手上有一只股票的最大收益. sell[i][j]sell[i][j]sell[i] ...

  8. 动态规划 - 买卖股票的最佳时机 III

    每天结束,一共有5种状态: 没有操作(可以不记录,收益为0) buy1:第一次买入 sell1:第一次卖出(完成一次交易) buy2:第二次买入 sell2:第二次卖出(完成两次交易) 状态转移: b ...

  9. 买卖股票的最好时机(一、二)

    目录 买卖股票的最好时机(一) 动态规划解决 贪心思想解决 买卖股票的最好时机(二) 贪心思想解决 动态规划解决 买卖股票是经典的动态规划问题,在动态规划的学习与练习中,最令我煎熬的就是状态方程递推, ...

  10. leetcode 309. Best Time to Buy and Sell Stock with Cooldown | 309. 最佳买卖股票时机含冷冻期(动态规划)

    题目 https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/ 题解 我知道要dp,但是不知道要怎么dp ...

最新文章

  1. wx.getLocation 的使用
  2. 推荐15个高质量学习网站,仅看一眼,就收获满满,赶紧收藏!
  3. python 登陆开心网图片批量下载-selenium实现
  4. python专科就业难吗-听说Python就业难,是真的吗?
  5. Python的XML解析!
  6. 11道Python最基本的面试题
  7. python查看文档的软件_Python __doc__属性:查看文档
  8. 【mybatis】mybatis多表联查,存在一对多关系的,实体中使用List作为字段接收查询结果的写法...
  9. 广州 office365的开发者训练营交流活动简报
  10. android版chrome为什么没有扫,android – 无法使用谷歌条码扫描仪
  11. Linux内核编程的特点
  12. Web CAD SDK 14.1.0 New Crack
  13. fiddler Android下https抓包全攻略
  14. (转)爆款游戏推动硬件普及,5G 促进 VR 产业规模化运用
  15. 三阶魔方还原步骤图_七步玩转三阶魔方还原公式及步骤图解教程
  16. 网易暴力裁员事件 网易员工疑遭网易暴力裁员
  17. JAVA基础----终弄清java核心技术卷1中的int fourthBitFromRight = (n 0b1000 ) / 0b1000;是怎么回事了。。。
  18. BWAI学习记录001_星际争霸BWAPI 4.4.0下AI(ualbertabot)配置安装
  19. 20# Vowel Count数元音-字典
  20. python爬虫必备防检测工具

热门文章

  1. TypeScript等无法获取到歌曲播放的位置信息时,关于歌曲的续播
  2. 微信分享朋友圈功能开发流程详解
  3. PHP、TP5生成下载word
  4. TWS耳机供应链,看看背后都有谁?
  5. Ubuntu 8.04中文智能拼音输入法
  6. t检验(t test)
  7. ubuntu QT Creator Fatal IO error 2 (没有那个文件或目录) on X server :0
  8. 使用select2 实现拼音全拼和首字母 搜索
  9. 计算机权限全部用户,允许所有人权限应用于匿名用户 (Windows 10) - Windows security | Microsoft Docs...
  10. 聊天系统服务器端类图,使用Java多线程来实现多人聊天室 附实例代码