![在这里插入图片描述](https://img-blog.csdnimg.cn/20190705121951451.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pvbGV3aXQ=,size_16,color_FFFFFF,t_70)
一个通用方法团灭 6 道股票问题
dp[-1][k][0] = 0
解释:因为 i 是从 0 开始的,所以 i = -1 意味着还没有开始,这时候的利润当然是 0 。
dp[-1][k][1] = -infinity
解释:还没开始的时候,是不可能持有股票的,用负无穷表示这种不可能。
dp[i][0][0] = 0
解释:因为 k 是从 1 开始的,所以 k = 0 意味着根本不允许交易,这时候利润当然是 0 。
dp[i][0][1] = -infinity
解释:不允许交易的情况下,是不可能持有股票的,用负无穷表示这种不可能。
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
if(k<1 || prices.empty()) return 0;
if(prices.size()<k*2)
return maxProfitInf(prices);
else
return maxProfitK(k,prices);
}
int maxProfitK(int k, vector<int>& prices) {
int n = prices.size();
int dp[n][k+1][2];
for(int i=0;i<n;++i){
for(int j=k;j>0;--j){
if(i==0){
dp[i][j][0]=max(0,INT_MIN+prices[i]);
dp[i][j][1]=max(INT_MIN,-prices[i]);
}
else{
dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]+prices[i]);
if(j==1)
dp[i][j][1]=max(dp[i-1][j][1],-prices[i]);
else
dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-1][0]-prices[i]);
}
}
}
return dp[n-1][k][0];
}
int maxProfitInf(vector<int>& prices) {
int pmax=0;
for(int i=1;i<prices.size();++i){
if(prices[i]>prices[i-1])
pmax+=prices[i]-prices[i-1];
}
return pmax;
}
};