您的位置:首页 > 其它

[leetcode] 188.Best Time to Buy and Sell Stock IV

2015-08-26 15:59 323 查看
题目:

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次。可以参考前面类似的几个题目/article/9675987.html(买卖一个回合),/article/9675988.html(买卖多个回合,随意),/article/9675989.html(最多买卖两个回合)

思路:

如果卖的次数超过所有天数的减一的值,那么其本质就是可以随便多少次买入卖出,即使用这里的贪心方法解题/article/9675988.html

否则,仍旧使用动态规划。最多k次交易,那么其实就是2*k个状态,第一个交易回合的买入,第一个交易回合的卖出。。。。第k个交易回合的买入,第看个交易回合的卖出。我们依旧开始时手上的收益是0元,那么第一次买入的时候相当于收益是-prices[i]。如果是处于第j次回合了,那么如果是处于第j次回合的买入,那么就是相当于第j-1回合的卖出后的收益减去prices[i]。如果是处于第j次回合的卖出,那么就相当于在第j个回合的买入后加上这天卖出的价格得到了新的收益。

状态转移方程就是:

profit[2*j] = profit[ 2 * j - 1] - prices[i];//第j轮中买入,依赖在第j-1轮中卖出后的收益

profit[2* j +1]= profit[2*j] + prices[i];//第j轮中卖出,依赖在第j轮时买入后还收益多少

以下的代码中,会用二维数组来区分在第i天之前的收益情况,与在第i天的更新的收益情况。

以上。

代码如下:

class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
int result = 0;
int size = prices.size();
if(size == 0 || k <= 0)return 0;
if(k >= size - 1) {
for(int i = 1; i < size; i++) {
if(prices[i] > prices[i-1])
result += prices[i] - prices[i-1];
}
return result;
}
else {
vector<vector<int>> profit(2, vector<int>(2*k, 0));
for(int i = 0; i < k; i++) {
profit[0][2*i] = INT_MIN;
}
int curr = 1, last = 0;
for(int i = 0; i < size; i++) {
profit[curr][0] = max(profit[last][0], -prices[i]);
for(int j = 1; j < 2*k; j++) {
if(j&0x01)profit[curr][j] = max(profit[last][j], profit[last][j-1] + prices[i]);
else profit[curr][j] = max(profit[last][j], profit[last][j - 1] - prices[i]);
}
swap(curr, last);
}
int result = INT_MIN;
for(int i = 1; i <= k; i++) {
result = max(result, profit[last][i*2 - 1]);
}
return result;
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: