leetcode 123 Best Time to Buy and Sell Stock III

参考:https://www.cnblogs.com/grandyang/p/4281975.html

  https://blog.csdn.net/linhuanmars/article/details/23236995

动态规划的题

local[i][j]:到第i天最多进行j次交易,且最后一次交易在第i天卖出,此时的最大的利润。

global[i][[j]:到第i天最多进行j次交易,此时的最大利润。

local的递推公式为:local[i][j]=max(global[i-1][j-1]+max(diff,0),local[i-1][j]+diff),其中,

  global[i-1][j-1]+max(diff,0)表示,在第i-1天共进行了j-1次交易,里面有两种情况:

    1. 第j-1次交易的卖出在i-1天之前,此时最后一次交易要么是i-1天买入,i天卖出(利润为diff),要么是i天买入,i天卖出(利润为0);

    2. 第j-1次交易的卖出在第i-1天,此时,最后一次交易要么是i-1天买入,i天卖出(也就是说,j-1次交易的卖出在第i-1天,j次交易的买入在第i-1天,卖出在第i天,利润为diff,此时global[i][j-1]=global[i][j]),要么是i天买入,i天卖出(利润为0)。

  local[i-1][j]+diff,local[i-1][j]表示第j次交易的卖出在第i-1天,+diff表示将第j次交易的卖出移动到第j天。

global[i][j]的递推公式为:global[i][j]=max(global[i-1][j],local[i][j]),其中,global[i-1][j]表示最后一次卖出在第i天之前,local[i][j]表示最后一次卖出在第i天。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.empty()) return 0;
        int l[3]={0},g[3]={0};
        for(int i=0;i<prices.size()-1;++i) {
            int diff=prices[i+1]-prices[i];
            for(int j=2;j>0;--j) {
                l[j]=max(g[j-1]+max(diff,0),l[j]+diff);
                g[j]=max(g[j],l[j]);
            }
        }
        return g[2];
    }
};
原文地址:https://www.cnblogs.com/LiuQiujie/p/12509307.html