当前位置: 首页 > news >正文

自助建站平台免费宣传推广活动策划

自助建站平台免费,宣传推广活动策划,二维码表白在线制作,广州做网站设计文章目录 前言一、309.最佳买卖股票时机含冷冻期二、714.买卖股票的最佳时机含手续费总结 前言 买卖股票 完结; 一、309.最佳买卖股票时机含冷冻期 确定dp数组以及下标的含义 dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。 其实本题很多…

文章目录

  • 前言
  • 一、309.最佳买卖股票时机含冷冻期
  • 二、714.买卖股票的最佳时机含手续费
  • 总结

前言

买卖股票 完结;


一、309.最佳买卖股票时机含冷冻期

  1. 确定dp数组以及下标的含义

dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。

其实本题很多同学搞的比较懵,是因为出现冷冻期之后,状态其实是比较复杂度

具体可以区分出如下四个状态:

  • 状态一:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有)
  • 不持有股票状态,这里就有两种卖出股票状态
    • 状态二:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期。或者是前一天就是卖出股票状态,一直没操作)
    • 状态三:今天卖出股票
  • 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!

注意这里的每一个状态,例如状态一,是持有股票股票状态并不是说今天一定就买入股票,而是说保持买入股票的状态即:可能是前几天买入的,之后一直没操作,所以保持买入股票的状态

  1. 确定递推公式

达到买入股票状态(状态一)即:dp[i][0],有两个具体操作:

  • 操作一:前一天就是持有股票状态(状态一),dp[i][0] = dp[i - 1][0]
  • 操作二:今天买入了,有两种情况
    • 前一天是冷冻期(状态四),dp[i - 1][3] - prices[i]
    • 前一天是保持卖出股票的状态(状态二),dp[i - 1][1] - prices[i]

那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);

达到保持卖出股票状态(状态二)即:dp[i][1],有两个具体操作:

  • 操作一:前一天就是状态二
  • 操作二:前一天是冷冻期(状态四)

dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);

达到今天就卖出股票状态(状态三),即:dp[i][2] ,只有一个操作:

昨天一定是持有股票状态(状态一),今天卖出

即:dp[i][2] = dp[i - 1][0] + prices[i];

达到冷冻期状态(状态四),即:dp[i][3],只有一个操作:

昨天卖出了股票(状态三)

dp[i][3] = dp[i - 1][2];

  1. dp数组如何初始化

这里主要讨论一下第0天如何初始化。

如果是持有股票状态(状态一)那么:dp[0][0] = -prices[0],一定是当天买入股票。

保持卖出股票状态(状态二),这里其实从 「状态二」的定义来说 ,很难明确应该初始多少,这种情况我们就看递推公式需要我们给他初始成什么数值。

如果i为1,第1天买入股票,那么递归公式中需要计算 dp[i - 1][1] - prices[i] ,即 dp[0][1] - prices[1],那么大家感受一下 dp[0][1] (即第0天的状态二)应该初始成多少,只能初始为0。想一想如果初始为其他数值,是我们第1天买入股票后 手里还剩的现金数量是不是就不对了。

今天卖出了股票(状态三),同上分析,dp[0][2]初始化为0,dp[0][3]也初始为0。

  1. 确定遍历顺序

从递归公式上可以看出,dp[i] 依赖于 dp[i-1],所以是从前向后遍历。

  1. 举例推导dp数组

代码:

class Solution {public int maxProfit(int[] prices) {if(prices == null || prices.length <2){return 0;}int[][] dp = new int[prices.length][4];//持有股票  前一天也持有+卖出后买入+冷冻期后买入//保持卖出股票  前一天卖出了+ 前一天是冷冻期//今天卖出股票  买入后卖出//冷冻期dp[0][0] = -prices[0];for(int i = 1;i<prices.length;i++){dp[i][0] = Math.max(dp[i-1][0],Math.max(dp[i-1][1]-prices[i],dp[i-1][3]-prices[i]));dp[i][1] = Math.max(dp[i-1][1],dp[i-1][3]);dp[i][2] = dp[i-1][0]+prices[i];dp[i][3] = dp[i-1][2];}return Math.max(dp[prices.length-1][1],Math.max(dp[prices.length-1][2],dp[prices.length-1][3]));}
}

二、714.买卖股票的最佳时机含手续费

这里重申一下dp数组的含义:

dp[i][0] 表示第i天持有股票所省最多现金。 dp[i][1] 表示第i天不持有股票所得最多现金

如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来

  • 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
  • 第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]

所以:dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);

在来看看如果第i天不持有股票即dp[i][1]的情况, 依然可以由两个状态推出来

  • 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
  • 第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金,注意这里需要有手续费了即:dp[i - 1][0] + prices[i] - fee

所以:dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);

class Solution {public int maxProfit(int[] prices, int fee) {int len =prices.length;int[][] dp = new int[len][2];dp[0][0] = -prices[0];for(int i=1;i<len;i++){//持股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]-fee);}return dp[len-1][1];// return Math.max(dp[len-1][0],dp[len-1][1]);}
}


总结

从买卖一次到买卖多次,从最多买卖两次到最多买卖k次,从冷冻期再到手续费,最后再来一个股票大总结,可以说对股票系列完美收官了。

http://www.yayakq.cn/news/70453/

相关文章:

  • 邢台地区网站建设服务周到天津免费建设网站
  • 沈阳网站推广¥做下拉去118cr广州市建设注册中心网站
  • 网站设计风格分类wordpress近期文章小工具
  • 汕头网站建设制作报价上海工程信息网市在建工程网
  • 南京建设厅官方网站深圳创业补贴申请
  • 有什么做logo网站flash做ppt的模板下载网站
  • h5和网站的区别个人业务网站免费制作
  • 太原市手机网站建设wordpress 页面 js
  • 做介绍自己的短视频网站搭建小程序多少钱
  • 建设厅网站实名制系统如何解聘投放广告怎么投放
  • wordpress 站群会员深圳做网站建设
  • 东莞网站制作方案定制多多搜索推广
  • 猜艺士科技网站建设专注高端品牌网站的设计
  • 北京网站设计浩森宇特济南教育论坛网站建设
  • iis能建设网站吗网络游戏免费加盟代理
  • 江门网站建设推广wordpress 用什么编辑器
  • 上饶高端网站建设成都网络技术有限公司
  • 浙江众安建设集团有限公司网站公司注册网上怎么申请核名
  • 网站建设进度总结支付网站建设的分录
  • 网站设计素材模板wordpress地址更改
  • 软件下载网站如何履行安全管理汽车报价网址
  • 长沙专业做网站公司哪家好博客一号wordpress主题
  • 网站建设概要设计网站做游戏活动策划方案
  • 南京地区网站开发《c程序设计》精品课程网站建设
  • 肃宁县做网站哈尔滨网站制作公司电话
  • 可信网站查询官网苏州园区人才市场
  • 网站建设模板ppt模板wordpress弹窗留言
  • 王璐 牟平 网站建设泉州做网站价格
  • 泰安网站建设流程wordpress 好玩的功能
  • 外贸网站制作公司建网站要租服务器吗