动态规划,计算股票最大收益

2023-11-06

问题描述:

给定一个整数数组prices,它的第i个元素prices[i]是一支给定的股票在第i天的价格,设计一个算法来计算你所能获取的最大利润。

算法思路:

动态规划

C++源码:

class Solution {
public:
    //1.最多交易一次
    int maxProfit(vector<int>& prices) {
        int maxPro = 0;        //最大收益
        int buyPri = INT_MAX;  //当前买入价格
        for (int i = 0; i < prices.size(); i++) {
            if (prices[i] - buyPri < 0) {
                buyPri = prices[i];
            } else if (prices[i] - buyPri > maxPro) {
                maxPro = prices[i] - buyPri;
            }
        }
        return maxPro;
    }
    int maxProfit(vector<int>& prices) {
        if (prices.size() < 2) {
            return 0;
        }
        int buy = -prices[0];  //买入状态最大收益
        int self = 0;          //卖出状态最大收益
        for (int i = 1; i < prices.size(); i++) {
            self = max(self, buy + prices[i]);
            buy = max(buy, -prices[i]);
        }
        return self;
    }

    //2.不限交易次数
    int maxProfit(vector<int>& prices) {
        int maxPro = 0;   //累计收益
        int buyPri = -1;  //当前买入价格,-1表示未持有
        for (int i = 1; i < prices.size(); i++) {
            if (buyPri < 0 && prices[i] > prices[i - 1]) {
                buyPri = prices[i - 1];
            } else if (buyPri >= 0 && prices[i] < prices[i - 1]) {
                maxPro += prices[i - 1] - buyPri;
                buyPri = -1;
            }
        }
        if (buyPri >= 0) {
            maxPro += prices.back() - buyPri;
        }
        return maxPro;
    }
    int maxProfit(vector<int>& prices) {
        if (prices.size() < 2) {
            return 0;
        }
        int buy = -prices[0];  //买入状态最大收益
        int self = 0;          //卖出状态最大收益
        for (int i = 1; i < prices.size(); i++) {
            int buy_old = buy;
            buy = max(buy, self - prices[i]);
            self = max(self, buy_old + prices[i]);
        }
        return self;
    }

    //3.最多交易2次
    int maxProfit(vector<int>& prices) {
        if (prices.size() < 2) {
            return 0;
        }
        int first_buy = -prices[0];   //第一次买入状态最大利润
        int first_self = 0;           //第一次卖出状态最大利润
        int second_buy = -prices[0];  //第二次买入状态最大利润
        int second_self = 0;          //第二次卖出状态最大利润
        for (int i = 1; i < prices.size(); i++) {
            second_self = max(second_self, second_buy + prices[i]);
            second_buy = max(second_buy, first_self - prices[i]);
            first_self = max(first_self, first_buy + prices[i]);
            first_buy = max(first_buy, -prices[i]);
        }
        return second_self;
    }

    //4.最多交易k次
    int maxProfit(int k, vector<int>& prices) {
        if (k < 1 || prices.size() < 2) {
            return 0;
        }
        vector<int> buy(k, -prices[0]);  //buy[i]表示第i次买入状态最大利润(i=0表示首次)
        vector<int> self(k, 0);          //self[i]表示第i次卖出状态最大利润
        for (int i = 1; i < prices.size(); i++) {
            buy[0] = max(buy[0], -prices[i]);
            self[0] = max(self[0], buy[0] + prices[i]);
            for (int j = 1; j < k; j++) {
                int temp = buy[j];
                buy[j] = max(buy[j], self[j - 1] - prices[i]);
                self[j] = max(self[j], temp + prices[i]);
            }
        }
        return self.back();
    }

    //6.不限交易次数,每次交易收取手续费
    int maxProfit(vector<int>& prices, int fee) {
        if (prices.size() < 2) {
            return 0;
        }
        int buy = -prices[0];  //当前买入状态最大利润
        int self = 0;          //当前卖出状态最大利润
        for (int i = 1; i < prices.size(); i++) {
            buy = max(buy, self - prices[i]);
            self = max(self, buy + prices[i] - fee);
        }
        return self;
    }
};

    //5.不限交易次数,卖出后第二天不能买入
    int maxProfit(vector<int>& prices) {
        if (prices.size() < 2) {
            return 0;
        }
        int buy = -prices[0];  //当前买入状态的最大利润
        int self_freez = 0;    //当前卖出且冻结状态的最大利润
        int self_free = 0;     //当前卖出且非冻结状态的最大利润
        for (int i = 1; i < prices.size(); i++) {
            int self_free_old = self_free;
            self_free = max(self_free, self_freez);
            self_freez = buy + prices[i];
            buy = max(buy, self_free_old - prices[i]);
        }
        return max(self_freez, self_free);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划,计算股票最大收益 的相关文章

随机推荐

  • 独家

    作者 Abhijit Telang 翻译 张睿毅 校对 丁楠雅 本文约2600字 建议阅读10分钟 本文介绍了做残差分析的方法及其重要性 以及利用R语言实现残差分析 在这篇文章中 我们通过探索残差分析和用R可视化结果 深入研究了R语言 残差
  • 软件测试工程师该如何规划自己的职业发展道路?

    软件测试 行业也在如火如荼的发展壮大 现在的 互联网 以及其他传统公司都需要大批量的软件测试人员 但是软件测试人员的职业规划也是值得我们深度思考的 大家都比较看好软件测试行业 只是因为表面上看起来 钱多事少加班少 其实这个都是针对个人运气好
  • ros-服务数据的定义与使用

    ros 服务数据的定义与使用 步骤 1 定义srv文件 在learning service文件夹下创建srv 在srv下创建person srv文件 2 在package xml中添加功能包依赖
  • 90后MIT博士开源创业再获5千万美元融资,进军3D数字内容创作者工具

    信息技术奥林匹克大赛获奖 保送清华姚班 麻省理工博士 创业公司CEO 这一组词汇对于大多数人来说仿佛都是可望而不可及的存在 个个都是如此地令人惊叹 随便沾上一个就能走上人生巅峰 但是偏偏能有这么一个人 集 巅峰 于一身 那就是 太极图形 创
  • APISIX Dashboard中文文档(一)

    2022年7月6日13 24 56 APISIX Dashboard中文文档 一 APISIX Dashboard中文文档 二 APISIX Dashboard中文文档 三 官方文档 https apisix apache org zh d
  • 51单片机中断系统的原理和运用

    QX MCS51开发板上使用的是DIP封装 双列直插式 有40只引脚 40只引脚按其功能来分 有三类 一 电源和时钟引脚 Vcc Vss XTAL1 XTAL2 电源引脚接入单片机工作电源 Vcc 40脚 接 5V电源 Vss 20脚 接地
  • java 毫秒转分钟和秒_Java程序将毫秒转换为分钟和秒

    Java程序将毫秒转换为分钟和秒 在上面的程序中 您将学习如何在Java中将毫秒分别转换为分钟和秒 示例1 将毫秒分别转换为分钟和秒 import java util concurrent TimeUnit public class Mil
  • 【Qt】错误:‘connect‘ was not declared in this scope 解决方法

    这种错误主要出现在在非继承QObject的类中或者一般函数中使用connect导致 原因是connect是QObject的一个static方法 将connet替换为QObject connect即可
  • BUUCTF-随便注、Exec、EasySQL、Secret File

    目录 强网杯 2019 随便注 ACTF2020 新生赛 Exec SUCTF 2019 EasySQL 极客大挑战 2019 Secret File 强网杯 2019 随便注 打开场景 里面有输入框 上面自带一个1 点击提交 有回显 输入
  • 毕业设计 基于单片机的双足机器人

    0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求 为了大家能够顺利以及最少的精力通过毕设 学长分享优质毕业设计项
  • starRocks配置两个数据源的多个IP进行访问数据库查询

    1 yml文件配置 注意mysql为master datasource mysql master type com alibaba druid pool DruidDataSource driver class name com mysql
  • 手把手教你如何使用Fiddler及使用图文详解

    01 什么是 Fiddler Fiddler 是一个 HTTP 协议调试代理工具 它能够记录并检查所有你的电脑和互联网之间的 HTTP 通讯 Fiddler 提供了电脑端 移动端的抓包 包括 http 协议和 https 协议都可以捕获到报
  • linux中如何修改文件夹的用户权限

    linux中如何修改文件夹权限 linux中 可以使用chown命令来修改文件夹的用户权限 环境 windows 7 virtualbox fedora 15 kde 下面举例给出 1 以普通用户admin登录linux 利用su 切换到r
  • MySQL数据库基本操作-正则表达式

    文章目录 一 基本介绍 二 的用法 三 的用法 四 的用法 五 和 的用法 六 和 的用法 七 的用法 八 的用法 九 的用法 一 基本介绍 正则表达式 regularexpression 描述了一种字符串匹配的规则 正则表达式本身就是一个
  • SpringMVC-整合SSM框架(狂神学习笔记)2021-10-03

    SpringMVC 狂神 整合SSM框架 1 整合SSM 1 环境要求 环境 IDEA Eclipse MySQL 5 7 Tomcat 9 Maven 3 6 要求 需要熟练掌握MySQL数据库 Spring JavaWeb及MyBati
  • day01(Flume)

    简介 一 概述 Flume是Apache提供的一套用于进行日志收集 汇聚和传输的框架 2 Flume的版本 Flume ng 和Flume og 不兼容 a Flume1 x Flume ng b Flume0 X Flume og htt
  • [leetcode 双周赛 6] 1152 用户网站访问行为分析

    目录 1152 Analyze User Website Visit Pattern 用户网站访问行为分析 描述 思路 代码实现 1152 Analyze User Website Visit Pattern 用户网站访问行为分析 描述 为
  • 依赖注入_生命周期

    目录 一 生命周期 二 三种不同生命周期对象比较 1 AddTransient 瞬时生命周期 2 AddSingleton 单例 3 AddScoped 总结 三者的区别 一 生命周期 1 给类构造函数中打印 看看不同生命周期的对象创建使用
  • 前端高频面试题

    我们在找工作时 需要结合自己的现状 针对意向企业做好充分准备 什么是前端开发 前端开发的作用是什么 前端开发是指利用HTML CSS和JavaScript等技术 开发用户在浏览器中直接与之交互的网页或应用的过程 前端开发的作用是将后端提供的
  • 动态规划,计算股票最大收益

    问题描述 给定一个整数数组prices 它的第i个元素prices i 是一支给定的股票在第i天的价格 设计一个算法来计算你所能获取的最大利润 算法思路 动态规划 C 源码 class Solution public 1 最多交易一次 in