笔记:代码随想录算法训练营day42:LeetCode188.买卖股票的最佳时机IV,309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费

学习资料:代码随想录

感觉还没有把这个股票的递归变成直觉的东西.anyway,每一天的各种状态都是从上一天的各种状态中优化出来的,到最后的再选择一个最大的状态,应该是没啥问题,不会有漏掉的情况

188.买卖股票的最佳时机IV

力扣题目链接

思路:和上一题差不多,限制上买卖次数倒比不限制买卖次数复杂了不少

要给上一题的代码套个循环

class Solution {
public:
    int maxProfit(int k, vector& prices) {
        vector> dp(prices.size(),vector(2*k+1,0));
        for(int j=1;j<=2*k-1;j+=2){
            dp[0][j] = -prices[0];
        }
        for(int i=1;i

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

力扣题目链接

思路:相对于前面的题又复杂了不少,尤其是初始化部分

区别于随便买卖那道题,要把不持有分为三种情况:保持不持有\今天卖的和前一天是冷冻期,冷冻期是在卖之后而卖是全买,所以不用纠结会不会冷冻了还持有一支

dp定义有了公式就可以推了

初始化详见注释

// 定义:dp[i][0]持有,dp[i][1]保持卖出态,dp[i][2]为今天执行的卖出操作,dp[i][3]为冷冻期
class Solution {
public:
    int maxProfit(vector& prices) {
        vector> dp(prices.size(),vector(4,0));

        dp[0][0] = -prices[0];
        dp[0][1] = 0;      //考虑到递推公式中dp[i-1][1]-prices[i]&&买之前是卖出态&&i=1,这里只能初始化为0
        dp[0][2] = 0;      //考虑dp[1][3] = dp[0][2];第一天是买了又卖了
        dp[0][3] = 0;      //考虑到dp[i-1][3]-prices[i]&&i=1&&第一天之前肯定是没有收入

        for(int i=1;i

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

力扣题目链接

卖掉时扣点手续费

//dp[i][0]为不持有,dp[i][1]为持有
class Solution {
public:
    int maxProfit(vector& prices, int fee) {
        vector> dp(prices.size(),vector(2,0));
        dp[0][0] = 0;    //一天内就别交手续费玩儿了哦
        dp[0][1] = -prices[0];
        for(int i=1;i

你可能感兴趣的:(笔记,动态规划,leetcode)