Java如何通过动态规划设计股票买卖最佳时机(java,开发技术)

时间:2024-05-02 19:21:13 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

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

买卖股票的最佳时机

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

示例:

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

动态规划

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

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

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

2. 状态转移方程:

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]

3. 初始化

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

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

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

代码:

//买卖股票的最佳时机publicintmaxProfit(int[]prices){//dp表示当天能获得的最大利润int[][]dp=newint[prices.length][2];//对每一天来说,就两个状态,一个是买入,一个是卖出dp[0][0]=-prices[0];//第一天买入dp[0][1]=0;//第一天卖出for(inti=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]);}returndp[prices.length-1][1];}

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

//买卖股票的最佳时机2——可以多次买入和卖出,但是注意每次只能持有一张股票,就是必须是买-卖-买-卖-买-卖....这种顺序publicintmaxProfit2(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=newint[prices.length][2];dp[0][0]=-prices[0];dp[0][1]=0;for(inti=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]);//当他可能执行股票卖出}returndp[prices.length-1][1];}

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

//买卖股票的最佳时机3——本题与上一题的区别在于,本题只能执行两次买入、卖出操作publicintmaxProfit3(int[]prices){//每次可执行的操作状态为,第一次买入、第一次卖出、第二次买入、第二次卖出,因此dp定义为int[][]dp=newint[prices.length][4];dp[0][0]=-prices[0];dp[0][1]=0;dp[0][2]=-prices[0];dp[0][3]=0;for(inti=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]);}returndp[prices.length-1][3];}

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

//买卖股票的最佳时期——最多进行K次交易publicintmaxProfit(intk,int[]prices){//就是两次交易的升级版int[][]dp=newint[prices.length][2*k+1];//奇数表示买入,偶数表示卖出//初始化for(intj=1;j<2*k;j+=2){dp[0][j]=-prices[0];}for(inti=1;i<prices.length;i++){for(intj=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]);}}returndp[prices.length-1][2*k];}

变式四:含冷冻期

//买卖股票含冷冻期publicintmaxProfit(int[]prices){//一共四种状态买入卖出(早就卖出保存卖出态,当天卖出)冷冻intdp[][]=newint[prices.length][4];//初始化dp[0][0]=-prices[0];for(inti=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];//冷冻态——前一天是卖出态2dp[i][3]=dp[i-1][2];}returnMath.max(dp[prices.length-1][1],Math.max(dp[prices.length-1][2],dp[prices.length-1][3]));}

变式五:含手续费

//买卖股票的最佳时机,含手续费publicintmaxProfit2(int[]prices,intfee){int[][]dp=newint[prices.length][2];//初始化dp[0][0]=-prices[0]-fee;for(inti=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]);}returndp[prices.length-1][1];}

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

本文:Java如何通过动态规划设计股票买卖最佳时机的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:基于GORM如何实现CreateOrUpdate下一篇:

8 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18