代码随想录算法训练营第五十一天| 309.最佳买卖股票时机含冷冻期 、714.买卖股票的最佳时机含手续费、总结

文章介绍了使用动态规划解决股票交易问题的两种情况:一种是包含冷冻期,需要考虑不能连续交易的状态;另一种是包含手续费,买入和卖出需要支付费用。在每种情况下,都通过定义二维dp数组来跟踪不同状态,并根据状态转移方程进行计算,以找到最佳买卖时机。
摘要由CSDN通过智能技术生成

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

至多买卖两次
分清楚动态规划所有状态至关重要,这是求dp数组的前提
和之前买卖股票问题解题思路相似,只是多增加了第二天的状态
总结:买卖股票问题,多增加状态就增加二维数组的状态数,用二维表达一维

  • 题目链接:代码随想录
  • 解题思路:
    1.四个状态
    1.状态一:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有)
    2.状态二:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期。或者是前一天就是卖出股票状态,一直没操作)
    3.状态三:今天卖出股票
    4.状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天。
    2.返回值
    不持有股票状态都有可能是最大值,取一个最大的即可
public int maxProfit(int[] prices) {
    //1.定义dp数组,4个状态
    int[][] dp = new int[prices.length][4];

    //2.初始化,非法状态根据递推公式要求来初始化
    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++) {
        //1.①上一天也持有②前一天是冷冻期今天买入③前一天是保持卖出股票状态
        dp[i][0] = Math.max(dp[i - 1][0],Math.max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]));
        //2.上一天也保持卖出②上一天是卖出股票
        dp[i][1] = Math.max(dp[i - 1][2],dp[i - 1][3]);
        //3.一种状态
        dp[i][2] = dp[i - 1][0] + prices[i];
        //4.一种状态
        dp[i][3] = dp[i - 1][3] - prices[i];
    }

    //不持有股票状态都有可能是最大值,取一个最大的即可
    return Math.max(dp[prices.length - 1][1], Math.max(dp[prices.length - 1][2], dp[prices.length - 1][3]));
}

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

本题和前面几题状态相似,就是不持股的时候要减去手续费,返回值为持股和不持股的状态取最大值

public int maxProfit(int[] prices, int fee) {
    //定义dp数组
    //dp[i][0]持股
    //dp[i][1]不持股
    int [][] dp = new int[prices.length][2];

    //初始化
    //不持股最大初始化为0
    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 Math.max(dp[prices.length - 1][0],dp[prices.length - 1][1]);

}

turn Math.max(dp[prices.length - 1][0],dp[prices.length - 1][1]);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值