//方法一
class Solution {
public:int dp[100005];int maxProfit(vector<int>& prices) {//dp[i]表示前i天买入卖出的获取的最大利润//min_val表示前i-1天买入的最小值;dp[0]=0;int min_val=prices[0];for(int i=1;i<prices.size();i++){dp[i]=max(dp[i-1],prices[i]-min_val);if(prices[i]<min_val){min_val=prices[i];}}int n=prices.size();return max(0,dp[n-1]);}
};//方法二class Solution {
public:int dp[100005][2]; int maxProfit(vector<int>& prices) {//dp[i][0]表示前i天买入股票的最大值;//dp[i][1]表示前i天不持有股票的最大值dp[0][0]=-prices[0];dp[0][1]=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]);}return dp[prices.size()-1][1];}
};
class Solution {
public:int dp[100005][2]; int maxProfit(vector<int>& prices) {//dp[i][0]表示第i天持有股票的最大值;//dp[i][1]表示第i天不持有股票的最大值dp[0][0]=-prices[0];dp[0][1]=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]);}return dp[prices.size()-1][1];}
};
class Solution {
public:int dp[100005][4];int maxProfit(vector<int>& prices) {//dp[i][0]表示在第i天持有第一支股票的最大值;//dp[i][1]表示在第i天不持有股票的最大值;//dp[i][2]表示在第i天持有第二支股票的最大值;//dp[i][3]表示在第i天不持有股票的最大值;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][3],dp[i-1][2]+prices[i]);}int n=prices.size();return max(0,max(dp[n-1][1],dp[n-1][3]));}
};
class Solution {
public:int dp[1005][205];int maxProfit(int k, vector<int>& prices) {//dp[i][j*2];第j次持有股票的最大金额//dp[i][j*2+1];第j次不持有股票的最大金额for(int i=0;i<k;i++){dp[0][i*2]=-prices[0];dp[0][i*2+1]=0;}for(int i=1;i<prices.size();i++){for(int j=0;j<k;j++){if(j==0){dp[i][j*2]=max(dp[i-1][j*2],-prices[i]);dp[i][j*2+1]=max(dp[i-1][j*2+1],dp[i-1][j*2]+prices[i]);}else{dp[i][j*2]=max(dp[i-1][j*2],dp[i][j*2-1]-prices[i]);dp[i][j*2+1]=max(dp[i-1][j*2+1],dp[i-1][j*2]+prices[i]);}}}int n=prices.size()-1;int res=0;for(int i=0;i<k;i++){res=max(dp[n][i*2+1],res);}return res;}
};
class Solution {
public:int dp[5005][4];int maxProfit(vector<int>& prices) {//dp[i][0]//持有股票//dp[i][1]//保持卖出股票//dp[i][2]//卖出股票;//dp[i][3]//冷冻期dp[0][0]=-prices[0];dp[0][1]=0;dp[0][2]=0;dp[0][3]=0;for(int i=1;i<prices.size();i++){dp[i][0]=max(dp[i-1][0],max(dp[i-1][3]-prices[i],dp[i-1][1]-prices[i]));dp[i][1]=max(dp[i-1][1],dp[i-1][3]);dp[i][2]=dp[i-1][0]+prices[i];dp[i][3]=dp[i-1][2];}int res=0;int n=prices.size()-1;for(int i=0;i<4;i++){res=max(res,dp[n][i]);}return res;}
};
class Solution {
public:int dp[50005][2];int maxProfit(vector<int>& prices, int fee) {//dp[i][0]持有股票的最大值//dp[i][1]//不持有股票的最大值dp[0][0]=-prices[0];dp[0][1]=0;for(int i=1;i<prices.size();i++){dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);} int n=prices.size()-1;int res=0;res=max(res,max(dp[n][0],dp[n][1]));return res;}
};