class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> maxProfits(prices.size(),vector<int>(2,0));
int maxPos = prices.size() - 1;
if(maxPos <= 0 ) return 0;
maxProfits[0][0] = 0;
maxProfits[0][1] = prices[0];//top
maxProfits[0][2] = prices[0];//bottom
for(int i=1;i<=maxPos;i++){
//maxProfits[i][0] = max(maxProfits[i-1][0],max(maxProfits[i-1][1]-prices[i],prices[i] - maxProfits[i-1][2]));
maxProfits[i][0] = max(maxProfits[i-1][0],prices[i] - maxProfits[i-1][2]);
maxProfits[i][2] = prices[i]<maxProfits[i-1][2] ? prices[i] : maxProfits[i-1][2];
}
vector<vector<int>> maxProfits1(prices.size(),vector<int>(2,0));
if(maxPos <= 0 ) return 0;
maxProfits1[maxPos][0] = 0;
maxProfits1[maxPos][1] = prices[maxPos];//top
maxProfits1[maxPos][2] = prices[maxPos];//bottom
for(int i=maxPos-1;i>=0;i--){
maxProfits1[i][0] = max(maxProfits1[i+1][0],maxProfits1[i+1][1] - prices[i]);
maxProfits1[i][1] = prices[i]>maxProfits1[i+1][1] ? prices[i] : maxProfits1[i+1][1];
}
int total = maxProfits1[0][0];//执行一次操作
for(int i=2;i<=maxPos-1;i++){
total = max(total,maxProfits[i-1][0] + maxProfits1[i][0] );
}
return total;
}
};
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> maxProfits(prices.size(),vector<int>(2,0));
int maxPos = prices.size() - 1;
if(maxPos <= 0 ) return 0;
maxProfits[0][0] = 0;
maxProfits[0][1] = prices[0];//top
maxProfits[0][2] = prices[0];//bottom
for(int i=1;i<=maxPos;i++){
//maxProfits[i][0] = max(maxProfits[i-1][0],max(maxProfits[i-1][1]-prices[i],prices[i] - maxProfits[i-1][2]));
maxProfits[i][0] = max(maxProfits[i-1][0],prices[i] - maxProfits[i-1][2]);
maxProfits[i][2] = prices[i]<maxProfits[i-1][2] ? prices[i] : maxProfits[i-1][2];
}
vector<vector<int>> maxProfits1(prices.size(),vector<int>(2,0));
if(maxPos <= 0 ) return 0;
maxProfits1[maxPos][0] = 0;
maxProfits1[maxPos][1] = prices[maxPos];//top
maxProfits1[maxPos][2] = prices[maxPos];//bottom
for(int i=maxPos-1;i>=0;i--){
maxProfits1[i][0] = max(maxProfits1[i+1][0],maxProfits1[i+1][1] - prices[i]);
maxProfits1[i][1] = prices[i]>maxProfits1[i+1][1] ? prices[i] : maxProfits1[i+1][1];
}
int total = maxProfits1[0][0];//执行一次操作
for(int i=2;i<=maxPos-1;i++){
total = max(total,maxProfits[i-1][0] + maxProfits1[i][0] );
}
return total;
}
};