[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天的更新的收益情况。
以上。
代码如下:
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; } } };
相关文章推荐
- android Studio svn 的配置
- IOS学习第六篇——代码块(block)
- Spring MVC textbox example
- HDU - 2545 树上战争(没有路径压缩的并查集)
- Mr. Process的一生-Linux内核的社会视角 (2) 启动
- [前端] grunt入门
- Android开发和iOS开发那个更有前景?如何选择?
- JDBC实现图片存取数据库(1)
- Intent 转向
- qt编程
- brew 出现 git 错误的问题分析
- BLToolkit: Sogen - Code generator for BLToolkit
- Axis 2 客户端必须的一些包
- linux 共享库的编译和连接
- PHP生成PDF文件
- 安卓5.0新特性
- UVO 120 Stacks of Flapjacks (整行输入+构造函数)
- 浅谈流形学习
- 并发编程网
- [LeedCode OJ]#162 Find Peak Element