//方法一
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;
}
};