继续完成了买卖股票的题(最多交易k次、冷冻期、手续费)最多交易k次://动态规划,最多只能买卖k次--分情况考虑(奇数持有,偶数卖出)//dp[i][j]:i为第几天,j为状态,奇数时是持有,偶数时是不持有//递推公式://dp[i][j+1] = max(dp[i-1][j+1], dp[i-1][j] - prices[i]);//今天之前就持有了或者今天才买入//dp[i][j+2] = max(dp[i-1][j+2], dp[i-1][j+1] + prices[i]);//昨天就不持有或者今天才卖出//初始化:第0天的所有状态都要初始化,偶数为0,奇数为-prices[0];//遍历顺序:外层遍历天数i,内层遍历j状态.if(prices.size() == 0) return 0;vector<vector<int>> dp(prices.size(), vector<int>(2*k+1, 0));for(int j = 1; j < 2*k; j+=2)//更新奇数情况下第0天的值{dp[0][j] = -prices[0];}for(int i = 1; i < prices.size(); i++){for(int j = 0; j < 2*k-1; j+=2){dp[i][j+1] = max(dp[i-1][j+1], dp[i-1][j] - prices[i]);dp[i][j+2] = max(dp[i-1][j+2], dp[i-1][j+1] + prices[i]);}}return dp[prices.size() - 1][2*k];冷冻期://动态规划--不限交易次数,但有冷冻期,即卖出的第二天不能操作//分情况考虑--持有、不持有、冷冻期//递推公式://持有:昨天已持有、今天买昨天之前就卖了、今天买昨天冷冻期//dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i], dp[i-1][3] + 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];//初始化:第0天全初始化为0if(prices.size() == 0) return 0;vector<vector<int>> dp(prices.size(), vector<int>(4, 0));dp[0][0] = -prices[0]; // 持股票for(int i = 1; i < prices.size(); i++){dp[i][0] = max(dp[i-1][0], max(dp[i-1][1] - prices[i], dp[i-1][3] - 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];}return max(dp[prices.size() - 1][1], max(dp[prices.size() - 1][2], dp[prices.size() - 1][3]));手续费:简单,在卖出时再减去手续费就行。