解法:动态规划
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
if(prices.size()<2 || k<1) return 0;
int n=prices.size();
//无限次情况
if (k >= n/2) {
int res = 0;
for (int i = 1; i < n; ++i) {
if (prices[i] > prices[i - 1]) {
res += prices[i] - prices[i - 1];
}
}
return res;
}
//状态:dp[n][k][t]表示第n天进行k次交易,t=1表示持有股票,t=0表示不持有股票
long dp[n][k+1][2]={0};
//初始化
if(k==0)
return 0;
if(k>=1){
dp[0][0][0]=0;
dp[0][0][1]=INT_MIN;
dp[0][1][0]=INT_MIN;
dp[0][1][1]=-prices[0];
}
if(k>1){
for(int i=2;i<=k;i++){
dp[0][i][1]=INT_MIN;
dp[0][i][0]=INT_MIN;
}
}
//传递方程
for(int i=1;i<n;i++){
for(int j=k;j>=1;j--){
dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]+prices[i]);
dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-1][0]-prices[i]);
}
}
long res=INT_MIN;
for(int i=0;i<=k;i++){
res=max(dp[n-1][i][0],res);
}
return res;
}
};