假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格。
设计一个算法来找到最大的利润。你最多可以完成 k
笔交易。
注意事项
你不可以同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
样例
给定价格 = [4,4,6,1,1,4,2,5]
, 且 k = 2
, 返回 6
.
挑战
http://blog.csdn.net/jc69186918/article/details/54926277
O(nk) 时间序列。
点题:这道题花了我很长时间来理解,特别是global/local算法模式,理解起来比较费力。但是下面的算法理解起来就要容易很多。
class Solution {
public:
/*
* @param K: An integer
* @param prices: An integer array
* @return: Maximum profit
*/
int maxProfit(int K, vector<int> &prices) {
// write your code here
if (K == 0 || prices.size() < 2) {
return 0;
}
// trade as more as possible
if (K >= prices.size()) {
int max_profix = 0;
for (int i = 1; i < prices.size(); i++) {
if (prices[i] > prices[i - 1]) {
max_profix += (prices[i] - prices[i - 1]);
}
}
return max_profix;
}
vector<vector<int>> buy(prices.size() + 1, vector<int>(K + 1, INT_MIN));
vector<vector<int>> sell(prices.size() + 1, vector<int>(K + 1, 0));
for (int i = 1; i <= prices.size(); i++) {
for (int j = 1; j <= K; j++) {
buy[i][j] = max(buy[i - 1][j], sell[i - 1][j - 1] - prices[i - 1]);
sell[i][j] = max(sell[i - 1][j], buy[i - 1][j] + prices[i - 1]);
}
}
return sell[prices.size()][K];
}
};
http://blog.csdn.net/jc69186918/article/details/54926277