每日一题——123. 买卖股票的最佳时机 III

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

分类:

  • dp

我以为是动态规划之实际上是暴力

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> dp(n, vector<int>(n, 0));
        // 记录区间[i, j]上的最小值最大值,以使dp[i][j]=该区间上的最大差
        int sum = 0;
        for(int i=0; i<n; i++){
            int _min = prices[i], _max = 0;
            dp[i][i] = _max;
            for(int j=i+1; j<n; j++){
                int diff = prices[j] - _min;
                _max = max(_max, diff);
                dp[i][j] = _max;
                _min = min(_min, prices[j]);
            }
            sum = max(dp[0][i] + dp[i][n-1], sum);
        }
        return sum;
    }
};
/* O(n^2) TLE **/

动态规划。第i结束时,存在4中产生利润变动的操作:

  • 第一次购入股票buy1
  • 第一次卖出股票sell1
  • 已经卖出一次的前提下,第二次购入股票buy2
  • 第二次卖出股票sell2

对于每一种操作,动态记录操作后的最大利润,那么就有第i+1天的最大利润为:(看代码)

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int ini = -prices[0];
        int buy1 = ini, sell1 = 0;
        int buy2 = ini, sell2 = 0;
        for(int i=1; i<prices.size(); i++){
            buy1  = max(buy1, -prices[i]);
            sell1 = max(sell1, buy1+prices[i]);
            buy2  = max(buy2, sell1-prices[i]);
            sell2 = max(sell2, buy2+prices[i]);
        }
        return sell2;
    }
};/* 71% **/

2021/01/09

posted @ 2021-01-09 12:07  vwmin  阅读(48)  评论(0)    收藏  举报