我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java如何通过动态规划设计股票买卖最佳时机

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java如何通过动态规划设计股票买卖最佳时机

本文小编为大家详细介绍“Java如何通过动态规划设计股票买卖最佳时机”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java如何通过动态规划设计股票买卖最佳时机”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

示例:

Java如何通过动态规划设计股票买卖最佳时机

动态规划

因为对每一天只有两个状态,买入股票和卖出股票,因此定义 dp[][2]

dp[i][2] 数组表示的含义 :

dp[i][0] 表示第 i 天买入股票能获得的最大利润,dp[i][1] 表示第一天卖出股票能获得的最大利润

状态转移方程:

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

解释: 第 i 天对买入股票状态,只有两种操作,买入股票或者不买股票。因此,第 i 天能获得的最大利润为 第 i 天不买股票(dp[i-1][0]) 和 第 i 天买入股票(-prices[i]) 的利润的最大值。

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

解释: 第 i 天对卖出股票,只有两种操作,卖出股票或者不卖出股票。因此,第 i 天能获得的最大利润为 第 i 天卖出股票 (dp[i-1][0] + prices[i])和 第 i 天不卖出股票 的利润的最大值 (dp[i-1][1]

初始化

第 0 天买入,得到的利润为 -price[0]

第 0 天卖出,得到的利润为 0

dp[0][0] = -price[0]dp[0][1] = 0

代码:

    // 买卖股票的最佳时机    public int maxProfit(int[] prices) {        // dp 表示当天能获得的最大利润        int[][] dp = new int[prices.length][2]; // 对每一天来说,就两个状态,一个是买入,一个是卖出        dp[0][0] = -prices[0]; // 第一天买入        dp[0][1] = 0; // 第一天卖出        for(int i=1; i<prices.length; i++){            dp[i][0] = Math.max(dp[i-1][0], -prices[i]);            dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]);        }        return dp[prices.length-1][1];    }

变式一: 可以重复买入,卖出

   // 买卖股票的最佳时机2 —— 可以多次买入和卖出,但是注意每次只能持有一张股票,就是必须是 买 - 卖 - 买 - 卖 - 买 - 卖 ....这种顺序    public int maxProfit2(int[] prices) {        // 本题与上题的区别就在于状态转移方程不同 -- 本题可以用之前得到的利润 (即 dp[i-1][1],上一轮卖出后剩下的钱) 再去买入,而上一题必须 0-price[i] 买入        // dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1]-prices[i]); ---- 买入股票能得到的最大利润状态转移方程有变化        int[][] dp = new int[prices.length][2];        dp[0][0] = -prices[0];        dp[0][1] = 0;        for(int i=1; i<prices.length; 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]); // 当他可能执行股票卖出        }        return dp[prices.length-1][1];    }

变式二:可以执行买入卖出操作两次

   // 买卖股票的最佳时机3 —— 本题与上一题的区别在于,本题只能执行两次买入、卖出操作    public int maxProfit3(int[] prices) {        // 每次可执行的操作状态为 ,第一次买入、第一次卖出、第二次买入、第二次卖出,因此 dp 定义为        int[][] dp = new int[prices.length][4];        dp[0][0] = -prices[0];        dp[0][1] = 0;        dp[0][2] = -prices[0];        dp[0][3] = 0;        for(int i=1; i<prices.length; i++){            dp[i][0] = Math.max(dp[i-1][0], -prices[i]);            dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]);            dp[i][2] = Math.max(dp[i-1][2], dp[i-1][1] - prices[i]);            dp[i][3] = Math.max(dp[i-1][3], dp[i-1][2] + prices[i]);        }        return dp[prices.length-1][3];    }

变式三:可以执行买卖操作 K 次

    // 买卖股票的最佳时期 —— 最多进行 K 次交易    public int maxProfit(int k, int[] prices) {        // 就是两次交易的升级版        int[][] dp = new int[prices.length][2*k+1]; // 奇数表示买入,偶数表示卖出        // 初始化        for(int j=1; j<2*k; j+=2){            dp[0][j] = -prices[0];        }        for(int i=1; i<prices.length; i++){            for(int j=0; j<2*k-1; j+=2){                dp[i][j+1] = Math.max(dp[i-1][j+1], dp[i-1][j] - prices[i]);                dp[i][j+2] = Math.max(dp[i-1][j+2], dp[i-1][j+1] + prices[i]);            }        }        return dp[prices.length-1][2*k];    }

变式四:含冷冻期

   // 买卖股票含冷冻期    public int maxProfit(int[] prices) {        // 一共四种状态 买入 卖出(早就卖出保存卖出态,当天卖出) 冷冻        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][3]-prices[i], dp[i-1][2]-prices[i]) );            // 卖出态1 —— 前一天就是卖出态1 + 前一天是冷冻态            dp[i][1] = Math.max(dp[i-1][1], dp[i-1][3]);            // 卖出态2 —— 当天卖出了            dp[i][2] = dp[i-1][0] + prices[i];            // 冷冻态 —— 前一天是卖出态2            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]));    }

变式五:含手续费

    // 买卖股票的最佳时机,含手续费    public int maxProfit2(int[] prices, int fee) {        int[][] dp = new int[prices.length][2];        // 初始化        dp[0][0] = -prices[0] - fee;        for(int i=1; i<prices.length; i++){            dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] - prices[i] - fee);            dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]);        }        return dp[prices.length-1][1];    }

读到这里,这篇“Java如何通过动态规划设计股票买卖最佳时机”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java如何通过动态规划设计股票买卖最佳时机

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java通过动态规划设计股票买卖最佳时机

动态规划可谓是大名鼎鼎,笔试面试中的高频考点,也是重点难点,动态规划类型题目灵活多变,难度系数也相对较高,往往我们做不好动态规划的题目就会与心仪的offer失之交臂,本篇文章我们就一起来研究一下动态规划设计股票买卖最佳时机
2022-11-13

Java如何通过动态规划设计股票买卖最佳时机

本文小编为大家详细介绍“Java如何通过动态规划设计股票买卖最佳时机”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java如何通过动态规划设计股票买卖最佳时机”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。买卖股
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录