请选择 进入手机版 | 继续访问电脑版
MSIPO技术圈 首页 IT技术 查看内容

代码随想录算法训练营 day51 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

2023-07-13


代码随想录

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

思路

思路:
分为4个状态(将卖出作为一个暂态,其他的持有和买入作为一个长久状态)
0-买入状态,前一天就是买入,或者在卖出or冷冻的基础上买入
1-不持有股票状态,前一天就不持有or前一天是冷冻期
2-今天卖出股票
3-冷冻期
dp[i][j]表示第i天在第j个状态的最大利润
dp[0][0]=-prices[0]
dp[0][1]=0
dp[0][2]=0
dp[0][3]=0
状态0从两种情况取最大:前一天就是买入,或者在卖出or冷冻的基础上买入dp[i][0]=max(dp[i-1][0],max(dp[i-1][3]-prices[i], dp[i-1][1]-prices[i]))
状态1从两种情况取最大:前一天就持有股票,当天买入
dp[i][1]=max(dp[i-1][1],dp[i-1][3])
状态2:当天售出
dp[i][2]=dp[i-1][0]+prices[i]
状态3:冷冻期
dp[i][3]=dp[i-1][2]

代码

class Solution {
    public int maxProfit(int[] prices) {
        int dp[][] = new int[prices.length][4];
        dp[0][0]=-prices[0];
        dp[0][1]=0;
        dp[0][2]=0;
        dp[0][3]=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][1]-prices[i]));
            dp[i][1]=Math.max(dp[i-1][1],dp[i-1][3]);
            dp[i][2]=dp[i-1][0]+prices[i];
            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]));

    }
}

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

思路

思路:关键是在卖出股票的时候减去手续费。
分为2个状态
0-持有股票状态,两种情况取最大:前一天就持有,当天买入
1-不持有股票状态,两种情况取最大:前一天就不持有,当天卖出
dp[i][j]表示第i天在状态j的最大利润
初始化
dp[0][0]=-prices[0];
dp[0][1]=0;
递推公式:
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]-fee);

代码

class Solution {
    public int maxProfit(int[] prices, int fee) {
        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]-fee);
        }
        return dp[prices.length-1][1];
 
    }
}

相关阅读

手机版|MSIPO技术圈 皖ICP备19022944号-2

Copyright © 2023, msipo.com

返回顶部