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

力扣188. 买卖股票的最佳时机 IV

动态规划

  • 思路:
    • 状态定义
      • 假设 buy[i][j] 是第 i 天进行第 j 笔交易,手上还买入一支股票的最大利润;
      • sell[i][j] 是第 i 天进行第 j 笔交易的最大利润;
    • 状态转移:
      • 第 i 天进行第 j 笔交易,手上还买入一支股票:
        • 第 i - 1 天即为此状态,第 i 天未进行操作,即 buy[i - 1][j];
        • 第 i - 1 天进行第 j 笔交易,第 i 天买入,即 sell[i - 1][j] - prices[i];
        • 则 buy[i][j] = max(buy[i - 1][j], sell[i - 1][j] - prices[i]);
      • 第 i 天进行第 j 笔交易:
        • 第 i - 1 天进行了第 j 笔交易,第 i 天未进行操作,即 sell[i - 1][j];
        • 第 i - 1 天进行了第 j - 1 笔交易并且手上还持有一支股票,第 i 天进行卖出,即 buy[i - 1][j - 1] + prices[i];
        • 则 sell[i][j] = max(sell[i - 1][j], buy[i - 1][j - 1] + prices[i]);
    • 初始状态:
      • buy[0][0] = -prices[0]
      • sell[0][0] = 0
      • 初始化第 0 天第 0 - k 笔交易值为 INT_MIN / 2;

        buy[0][i] = INT_MIN / 2;

        sell[0][i] = INT_MIN / 2;

    • 最大交易次数为天数的一半,即 k = std::min(k, size / 2);
    • 第 0 笔交易的时候进行修正(避免 j - 1 溢出)

      buy[i][0] = std::max(buy[i - 1][0], sell[i - 1][0] - prices[i]);

    • 最大利润为最后一天完成交易的最大值:

      *std::max_element(sell[size - 1].begin(), sell[size - 1].end());

class Solution {
public:int maxProfit(int k, vector<int>& prices) {int size = prices.size();if (0 == size) {return 0;}k = std::min(k, size / 2);std::vector<std::vector<int>> buy(size, std::vector<int>(k + 1));std::vector<std::vector<int>> sell(size, std::vector<int>(k + 1));buy[0][0] = -prices[0];sell[0][0] = 0;for (int i = 1; i <= k; ++i) {buy[0][i] = INT_MIN / 2;sell[0][i] = INT_MIN / 2;}for (int i = 1; i < size; ++i) {buy[i][0] = std::max(buy[i - 1][0], sell[i - 1][0] - prices[i]);for (int j = 1; j <= k; ++j) {buy[i][j] = std::max(buy[i - 1][j], sell[i - 1][j] - prices[i]);sell[i][j] = std::max(sell[i - 1][j], buy[i - 1][j - 1] + prices[i]);}}return *std::max_element(sell[size - 1].begin(), sell[size - 1].end());}
};

相关文章:

  • cissp 第10章 : 物理安全要求
  • PHP中excel带图片数据导入
  • Centos 磁盘挂载和磁盘扩容(新加硬盘方式)
  • <HarmonyOS第一课>1~10课后习题汇总
  • 使用HttpSession和过滤器实现一个简单的用户登录认证的功能
  • ControlNet构图控制
  • PCL 格网法计算点云的占地面积
  • React16源码: React中创建更新的方式及ReactDOM.render的源码实现
  • 收到的字符串写入xml并且将这个xml写入.zip文件中
  • 【设计模式】工厂模式
  • 【动态规划】C++算法:446等差数列划分 II - 子序列
  • 带前后端H5即时通讯聊天系统源码
  • ES-极客学习第二部分ES 入门
  • 二叉树的层序遍历经典问题(算法村第六关白银挑战)
  • 缓存cache和缓冲buffer的区别
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Angular数据绑定机制
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • ES6 学习笔记(一)let,const和解构赋值
  • es6要点
  • FastReport在线报表设计器工作原理
  • JAVA之继承和多态
  • js写一个简单的选项卡
  • Leetcode 27 Remove Element
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • React as a UI Runtime(五、列表)
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Vue组件定义
  • yii2中session跨域名的问题
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 构造函数(constructor)与原型链(prototype)关系
  • 猴子数据域名防封接口降低小说被封的风险
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 人脸识别最新开发经验demo
  • 小程序开发之路(一)
  • 应用生命周期终极 DevOps 工具包
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • Java性能优化之JVM GC(垃圾回收机制)
  • 移动端高清、多屏适配方案
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #{} 和 ${}区别
  • (7)STL算法之交换赋值
  • (C#)获取字符编码的类
  • (libusb) usb口自动刷新
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (黑马C++)L06 重载与继承
  • (理论篇)httpmoudle和httphandler一览
  • (十)T检验-第一部分
  • (十六)Flask之蓝图
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转) 深度模型优化性能 调参
  • (转)程序员疫苗:代码注入