股票买卖问题
来源:互联网 发布:java 获取访问者ip 编辑:程序博客网 时间:2024/05/11 11:01
题目详情及解法见http://blog.csdn.net/joylnwang/article/details/7078530
以下对应的是不限制买入卖出次数的情况:
int maxProfit(vector<int> &prices) { int sum = 0; for(int i = 1; i < prices.size() ; ++i) { int delta = prices[i] - prices[i-1]; if(delta > 0 ) { sum += delta; } } return sum; }
另外如果限定只可以一次买入卖出,那么问题就转化成一维数组的子数组最大和问题:
int maxProfit(vector<int> &prices) { int m = 0; int cur = 0; for(int i=1; i<prices.size(); i++){ if (cur < 0) cur = 0; cur += prices[i]-prices[i-1]; m = max(m,cur); } return m; }
如果限定最多可以买入卖出多次,则问题就变成一维数组的多段子数组最大和问题,每段子数组不能重叠。
设数组sum[i][j]表示前i个数的最大j段和,以第i个数结尾。
则有状态转移方程:sum[i][j] = max(max(sum[k][j-1]),sum[i-1][j])+a[i],j-1<=k<=i-1。
为了降低时间复杂度,引入另外一个数组maxsum[i][j],表示前i个数的最大j段和。
因此能得到maxsum[i][j] = max(maxsum[i-1][j], sum[i][j]),代码如下:
int maxProfit(vector<int> &prices) { const int times = 2; int sum[times+1] = {0}; int maxsum[times+1] = {0}; for (int i = 1; i < prices.size(); ++i) { int diff = prices[i] - prices[i-1]; int m = min(i, times); for (int j = m; j >= 1; --j) { sum[j] = max(sum[j], maxsum[j-1]) + diff; maxsum[j] = max(maxsum[j], sum[j]); } } return max(maxsum[1], maxsum[2]); }
- 股票买卖问题
- 股票买卖问题
- PHP求解股票买卖问题
- 股票买卖
- 股票买卖
- 股票买卖
- 股票买卖
- 股票买卖
- 股票买卖
- 一道亚马逊面试题(股票买卖问题)
- 股票买卖之问题转化为最大字段和
- 笔试算法题--股票买卖问题(两次买卖)
- 【openjudge】股票买卖
- 股票买卖--openjudge
- [转]股票买卖
- 确定股票买卖时机秘籍
- 股票买卖顺口遛
- 股票买卖前必读
- C语言的变量的内存分配
- 负载均衡简要概念
- Cocos2d-x 2013春季新功能发布和发展规划
- 初学Java Web,搭建开发环境(Eclipse+Tomcat+MySQL)
- 关于目前软件开发的两种模式 C/S B/S
- 股票买卖问题
- MSE v4.3.216
- zoj 2136 Longest Ordered Subsequence 最长上升子序
- 限制某个进程只能在某个CPU上运行
- 关于Servlet的简介
- 【Java】Java程序运行超时后退出或进行其他操作的实现
- CS模式与BS模式的比较分析
- POJ-1151-Atlantis
- lua dynamic libraries not enabled; check your Lua installation