算法训练第五十一天

714. 买卖股票的最佳时机含手续费 - 力扣(LeetCode)

总结:在买卖股票的最佳时机Ⅱ上多加了一个手续费,注意初始化以及递推公式中的变化就能完成此题。

代码:

class Solution {
public:
    int maxProfit(vector& prices, int fee) {
        if(prices.size() == 1)
        return 0;
        vector> dp(prices.size() + 1,vector(2,0));
        dp[1][0] = -prices[0] - fee; //持有股票
        dp[1][1] = 0;//不持有股票

        for(int i = 2;i <= prices.size();i++)
        {
            dp[i][0] = max(dp[i - 1][0],dp[i - 1][1] - prices[i - 1] - fee);
            dp[i][1] = max(dp[i - 1][1],dp[i - 1][0] + prices[i - 1]);
        }
        return max(dp[prices.size()][0],dp[prices.size()][1]);
    }
};

309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode)

总结:此题解决关键要把不持有股票的状态解开成几种状态,因为多了一个冷冻期。

代码:

class Solution {
public:
    int maxProfit(vector& prices) {
        if(prices.size() == 1)
        return 0;
        int n = prices.size();
        vector> dp(prices.size() + 1,vector(4,0));
        dp[1][0] = -prices[0];//持有股票状态
        dp[1][1] = 0;//保持卖完股票状态
        dp[1][2] = 0;//卖完股票状态(也就是当天出售股票)
        dp[1][3] = 0;//冷冻期

        for(int i = 2;i <= prices.size();i++)
        {
            dp[i][0] = max(dp[i - 1][0],max(dp[i - 1][1] - prices[i - 1],dp[i - 1][3] - prices[i - 1]));
            dp[i][1] = max(dp[i - 1][1],dp[i - 1][3]);
            dp[i][2] = dp[i - 1][0] + prices[i - 1];
            dp[i][3] = dp[i - 1][2];
        }
        return max(max(dp[n][0],dp[n][1]),max(dp[n][2],dp[n][3]));
    }
};

你可能感兴趣的:(算法,leetcode,职场和发展)