代码随想录算法训练营第五十三天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费、总结

本文主要是介绍代码随想录算法训练营第五十三天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费、总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码随想录算法训练营第五十三天

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

题目链接:309.最佳买卖股票时机含冷冻期

class Solution {
public:int maxProfit(vector<int>& prices) {vector<vector<int>>dp(prices.size(),vector<int>(4,0));dp[0][0] = 0;//不操作dp[0][1] = -prices[0];//持有dp[0][2] = 0;//不持有dp[0][3] = 0;//冷冻期for(int i =1;i<prices.size();i++){dp[i][0] = 0;dp[i][1] = max(dp[i-1][1],dp[i-1][3]-prices[i]);dp[i][2] = max(dp[i-1][2],dp[i-1][1]+prices[i]);dp[i][3] = dp[i-1][2];}return dp[prices.size()-1][2];}
};

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

题目链接:714.买卖股票的最佳时机含手续费

class Solution {
public:int maxProfit(vector<int>& prices, int fee) {vector<vector<int>>dp(prices.size(),vector<int>(3,0));dp[0][0] = 0;//不操作dp[0][1] = -prices[0];//持有dp[0][2] = 0;//不持有for(int i =1;i<prices.size();i++){dp[i][0] = 0;dp[i][1] = max(dp[i-1][1],dp[i-1][2]-prices[i]);dp[i][2] = max(dp[i-1][2],dp[i-1][1]+prices[i]-fee);}return dp[prices.size()-1][2];}
};

总结

买卖股票的dp数组dp[i][j],i是第i天的价格,有j是状态,根据题目需要分为持有,不持有,第k次持有,第k次卖出后(买入前),冷却期等。需要了解当前状态可能是由前一天的哪种状态转变过来的。

  1. 买卖一次:
    不持有=保持前一天的不持有或当天卖出

    dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]);
    

    持有=保持前一天的持有或者当天买入

    dp[i][1] = max(dp[i-1][1],0-prices[i]);
    
  2. 买卖多次:
    不持有=保持前一天的不持有或当天卖出

    dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]);
    

    持有=保持前一天的持有或者当天买入

    dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i]);
    
  3. 只能买卖2次:
    不操作:

    dp[i][0] = 0;
    

    第一次持有=保持之前持有或当天买入

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

    第一次不持有=保持之前不持有或当前卖出

    dp[i][2] = max(dp[i-1][2],dp[i-1][1]+prices[i]);
    

    第二次持有=保持之前持有或者当天买入

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

    第二次不持有=保持之前持有或者当天卖出

    dp[i][4] = max(dp[i-1][4],dp[i-1][3]+prices[i]);
    
  4. 只能买卖k次:
    总共状态有2k种,第k次持有或第k次不持有

     if (j % 2 == 1) //奇数持有dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i]);else  //偶数不持有dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + prices[i]);
    
  5. 含冷冻期:
    不操作:

    dp[i][0] = 0;
    

    持有:

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

    不持有:

    dp[i][2] = max(dp[i-1][2],dp[i-1][1]+prices[i]);
    

    冷冻期:

    dp[i][3] = dp[i-1][2];
    
  6. 含手续费:
    状态和2相同,卖出时多减一份手续费即可
    持有:

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

    不持有:

    dp[i][2] = max(dp[i-1][2],dp[i-1][1]+prices[i]-fee);           
    

这篇关于代码随想录算法训练营第五十三天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费、总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051527

相关文章

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的