Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete at most k transactions.
Note: You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
买股票问题升级版,可以购买k次。
利用买股票问题的第三个变式,可以构造两个dp数组。
sell[i]表示第i次卖出后最大持有的金钱
buy[i]表示第i次买入后最大持有的金钱
卖出的钱由买入的钱加上当前股票卖出的钱,买入的钱由前一次卖出的钱减去当前买股票花去的,因此可以得到两个转移方程
sell[j] = max(sell[j], buy[j] + prices[i]);
buy[j] = max(buy[j], sell[j-1] - prices[i]);
有个小陷阱,k可能很大,达到比总天数多,这种情况下,问题等价于买卖任意次,直接贪心就可以了
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
if(k > prices.size())
{
int res = 0;
for(int i = 1 ; i < prices.size(); i++) if(prices[i] > prices[i-1]) res += prices[i]-prices[i-1];
return res;
}
vector<int> sell(k+1, 0), buy(k+1, INT_MIN);
for(int i = 0; i < prices.size() ; i++)
{
for(int j = k; j > 0 ; j--)
{
sell[j] = max(sell[j], buy[j] + prices[i]);
buy[j] = max(buy[j], sell[j-1] - prices[i]);
}
}
return sell[k];
}
};