[LeetCode] Best Time to Buy and Sell Stock IV
2015-02-23 00:08
267 查看
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远大于数组的大小时,上述算法将变得低效。因此将其改用不限交易次数的方式解决。
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).
解题思路
采用动态规划来解决问题。我们需要维护如下两个量:
global[i][j]:当前到达第
i天最多可以进行
j次交易,所得到的最大利润。
local[i][j]:当前到达第
i天最多可以进行
j次交易,而且最后一次交易在当天卖出,所得到的最大利润。
状态转移方程:
global[i][j] = max(local[i][j], global[i-1][j])
上述方程比较两个量的大小:①当前局部最大值;②过往全局最大值。
local[i][j] = max(global[i-1][j-1] + max(diff, 0), local[i-1][j] + diff)
上述方程比较两个量的大小:
①全局到
i-1天进行
j-1次交易,然后加上今天的交易(如果今天的交易赚钱的话)。
②取局部第
i-1天进行
j次交易,然后加上今天的差值(
local[i-1][j]是第
i-1天卖出的交易,它加上
diff后变成第
i天卖出,并不会增加交易次数。无论
diff是正还是负都要加上,否则就不满足
local[i][j]必须在最后一天卖出的条件了)
另外需要注意的一个问题是,当k远大于数组的大小时,上述算法将变得低效。因此将其改用不限交易次数的方式解决。
实现代码
/***************************************************************** * @Author : 楚兴 * @Date : 2015/2/22 23:42 * @Status : Accepted * @Runtime : 15 ms ******************************************************************/ #include <iostream> #include <vector> #include <algorithm> using namespace std; class Solution { public: int maxProfit(int k, vector<int> &prices) { int len = prices.size(); if (len == 0) { return 0; } if (k >= len) { return helper(prices); } vector<int> max_local(k + 1, 0); vector<int> max_global(k + 1, 0); int diff; for (int i = 0; i < len - 1; i++) { diff = prices[i + 1] - prices[i]; for (int j = k; j >= 1; j--) { max_local[j] = max(max_global[j - 1] + max(diff, 0), max_local[j] + diff); max_global[j] = max(max_local[j], max_global[j]); } } return max_global[k]; } int helper(vector<int> &prices) { int profit = 0; for (int i = 0; i < prices.size() - 1; i++) { profit = max(profit, profit + prices[i + 1] - prices[i]); } return profit; } };
相关文章推荐
- LeetCode(188) Best Time to Buy and Sell Stock IV
- leetcode 第188题,我的解法,Best Time to Buy and Sell Stock IV
- LeetCode - Best Time to Buy and Sell Stock IV
- Best Time to Buy and Sell Stock IV--LeetCode
- LeetCode - Best Time to Buy and Sell Stock IV
- LeetCode-Best Time to Buy and Sell Stock IV -解题报告
- LeetCode OJ Best Time to Buy and Sell Stock I II III IV
- LeetCode(188) Best Time to Buy and Sell Stock IV (Java)
- LeetCode之“动态规划”:Best Time to Buy and Sell Stock I && II && III && IV
- [LeetCode] Best Time to Buy and Sell Stock IV 买卖股票的最佳时间之四
- LeetCode--Best Time to Buy and Sell Stock IV(DP + 滚动数组)
- Leetcode: Best Time to Buy and Sell Stock IV
- LeetCode Best Time to Buy and Sell Stock IV
- LeetCode188:Best Time to Buy and Sell Stock IV
- LeetCode – Refresh – Best Time to Buy and Sell Stock iv
- 188. Best Time to Buy and Sell Stock IV Leetcode Python
- Best Time to Buy and Sell Stock IV -- leetcode
- 【LeetCode】 Best Time to Buy and Sell Stock I II III IV 解题报告
- Java for LeetCode 188 Best Time to Buy and Sell Stock IV【HARD】
- LeetCode : Best Time to Buy and Sell Stock III & IV