参考: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]; } };