题目描述
思路分析
状态机dp+滚动数组优化
滚动数组优化通法:第一维变2,每次&1
代码实现
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
int n=prices.size();
if(k>=n/2){
int res=0;
for(int i=0;i+1<n;i++){
if(prices[i+1]>prices[i]) res+=prices[i+1]-prices[i];
}
return res;
}
vector<vector<int>> f(2,vector<int>(k+1,-1e8));
auto g=f;
f[0][0]=0;
int res=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=k;j++){
f[i&1][j]=max(f[i-1&1][j],g[i-1&1][j]+prices[i-1]);
g[i&1][j]=g[i-1&1][j];
if(j) g[i&1][j]=max(g[i&1][j],f[i-1&1][j-1]-prices[i-1]);
res=max(res,f[i&1][j]);
}
}
return res;
}
};