【代码随想录】刷题Day50

1.买卖股票的最佳时机 III

123. 买卖股票的最佳时机 III

1.dp数组的设定:由于前两道题目分别提供了如何求最大值和如何将大的价值传输给下一次的结果。我们其实可以知道本题的求两次买入的最大价值无非定义四个数组,表示四个不同的状态:dp[i][0]第一次持有股票,dp[i][1]第一次卖出股票,dp[i][2]第二次持有股票,dp[i][3]第二次卖出股票。

2.dp数组的条件公式:第一次买入的逻辑就是第一题找最大值的条件dp[i][0]=max(dp[i-1][0],-prices[i]),这里不过多解释了;第一次卖出逻辑也与之前的相同dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]);第二次买入是第一次卖出的基础上得到的,所以我们比较的条件要么是第一次卖出后买入要么是上一次第二次买入的结果max(dp[i-1][2],dp[i-1][1]-prices[i]);第二次卖出逻辑其实就是第二次买入后的卖出和上一次卖出的比较max(dp[i-1][2]+prices[i],dp[i-1][3])

3.初始化第一次买入dp[0][0]=-prices[0],第一次买入又卖出dp[0][1]=0;第二次买入dp[0][2]=-prices[0];第二次买入又卖出dp[0][3]=0;

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

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

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

1.根据上一题其实就知道我们需要的dp数组定义是什么了,其实我们能知道所谓的dp数组需要k*2+1个行来表示状态。特别的dp[0][i]是指不买入的状态,之所以需要这个状态是为了让循环k次好写dp数组的条件

2.初始化,不买入dp[0][0]=0毫无疑问,循环中,奇数次i表示当前持有股票的次数i,偶数次表示当前卖出股票的次数ii-1。根据上一题的描述自然得出初始化的条件为:dp[0][i]=-prices[0];dp[0][i+1]=0;

3.dp数组的条件其实也很简单:持相同股有两种情况而来,一是上一次的持相同股价值,二是当前持相同股少一次加上买入当前的股票,由此的条件dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]-prices[i]);卖出相同股也有两种情况而来,一是上一次的卖出相同股价值,二是上一次持相同股卖出当前股票,由此的条件dp[i][j+1]=max(dp[i-1][j+1],dp[i-1][j]+prices[i]);

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

猜你喜欢

转载自blog.csdn.net/m0_63488627/article/details/131080697