题目描述如上,可以顺着前几题动态规划的思想来做,弄清这里与前几题的区别:
1.这里可以交易k次,买卖股票(三)是两次。
2.不需要像三一样去写多种状态转移方程。
既然可以交易k次,那可以定义两个一维数组,一组为buy,另外一组为sell,只是在遍历的时候要弄清楚次序问题,这里首先要顺着数组顺序(股票每天的价格)遍历,然后内嵌循环是k次交易的遍历。
vector<int> buy(k,-prices[0]);
vector<int> sell(k,0); //定义两个数组,将buy初始化为购入第一天股票所剩利润,sell初始化为0;
for(int i=0;i<prices.size();i++){ //按照数组顺序遍历
buy[0]=max(buy[0],-prices[i]);
sell[0]=max(sell[0],buy[0]+prices[i]);//对于每一天不同的价格重新定义第一次购入卖出
for(int j=1;j<k;j++){ //k次购入卖出
buy[j]=max(buy[j],sell[j-1]-prices[i]);
sell[j]=max(sell[j],buy[j]+prices[i]); //注意这里j从1开始定义,而prices要与i相关,即每一天价格;
}
}
//最终输出与之前一致,输出最后一个sell即可
return sell[k-1];
完整代码如下:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
vector<int> buy(k,-prices[0]);
vector<int> sell(k,0);
for(int i=0;i<prices.size();i++){
buy[0]=max(buy[0],-prices[i]);
sell[0]=max(sell[0],buy[0]+prices[i]);
for(int j=1;j<k;j++){
buy[j]=max(buy[j],sell[j-1]-prices[i]);
sell[j]=max(sell[j],buy[j]+prices[i]);
}
}
return sell[k-1];
}
};
int main(){
Solution solution;
vector<int> prices={2,8,6,4,6,56,56,9,4,641,2,158};
int max_profit=solution.maxProfit(3,prices);
cout<< max_profit <<endl
return 0;
}