class Solution {
public:intmaxProfit(int k, vector<int>& prices){int N = prices.size();if(N ==0)return0;
vector<int>dp(N,0);//add-start:此处需要添加k很大的处理//add-endwhile(k-->0){for(int i =1; i < N;++i)
dp[i]=max(dp[i -1]- prices[i -1]+ prices[i], dp[i]);for(int i =1; i < N;++i)
dp[i]=max(dp[i], dp[i -1]);}return dp[N -1];}};/* 作者解释
while(k-- > 0)
{
//第1个for循环中,dp[i]代表第i天完成前k次交易所能获得的最大价值。
//第2个for循环中,dp[i]代表前i天完成前k次交易所能获得的最大价值。
}
第一个for循环中,
dp[i]的值有两种可能:
第一,第i天完成第k笔买和卖,第k笔收益为0。
第二,第i天完成第k笔的卖出,之前的一些天完成其他交易。满足这种要求的所有情况,都能和第i-1天完成第k笔交易的情况建立一对一的关系,只是第k笔交易的卖出价格由prices[i - 1]变为了prices[i]。所以dp[i] = dp[i - 1] - prices[i - 1] + prices[i]
*/
// 这部分是对k很大情况(e.g k=1e8)的处理,需添加到上面代码段里的add部分if(k >= N /2){
ret =0;for(int i =1; i < N;++i){if(prices[i]> prices[i -1])
ret += prices[i]- prices[i -1];}return ret;}
作者:yushuo-guan