股票交易 动态规划 分治算法
2017-04-21 23:46
344 查看
现在,有一份很长很长的连续时间点股票价格数据(按时间从先到后顺序),老板需要你快速的寻找在这段数据范围内一次买卖股票的每股最大收益(假设所有人买卖股票都在给定时间点的数据范围内)。
多组测试数据(10组左右),以EOF结尾。
每组测试数据分为两行第一行为数组长度n,正整数,代表股票价格数据长度,数据范围为0
除了分治算法,本题还可以用动态规划求解。本题的最优解包含其子问题的最优解,具
有最优子结构性质。
thissum(i)表示以i为起点的最大连续下标最大的和,而maxsum(i)表示前i个元素的最大子数组的和。有递归式:
thissum(i)=max(a[i],thissum(i-1)+a[i]);
maxsum(i)=max(maxsum(i-1),thissum(i+1))。
多组测试数据(10组左右),以EOF结尾。
每组测试数据分为两行第一行为数组长度n,正整数,代表股票价格数据长度,数据范围为0
#include <iostream> #include <limits.h> #include <stdio.h> int c[1000000],b[1000000]; using namespace std; int maxCrossingSubarray(int*a,int low,int mid,int high) { int left_sum=INT_MIN,right_sum=INT_MIN,sum=0; for(int i=mid;i>=low;i--) { sum=sum+a[i]; if(sum>left_sum) left_sum=sum; } sum=0; for(int j=mid+1;j<=high;j++) { sum=sum+a[j]; if(sum>right_sum) right_sum=sum; } return (left_sum+right_sum); } int maxSubarray(int*a,int low,int high) { if(low==high) return a[low]; int mid=(low+high)/2; int left_max=maxSubarray(a,low,mid); int right_max=maxSubarray(a,mid+1,high); int middle_max=maxCrossingSubarray(a,low,mid,high); if(left_max>=right_max&&left_max>=middle_max) return left_max; if(right_max>=left_max&&right_max>=middle_max) return right_max; return middle_max; } int 4000 main() { int n; while(~scanf("%d",&n)){ for(int i=0;i<n;i++) cin>>c[i]; for(int j=1;j<=n;j++) b[j-1]=c[j]-c[j-1]; int h=maxSubarray(b,0,n-2);//调用函数 if(h>0) cout<<h<<'\n'; else cout<<"No solution"<<'\n'; } }
除了分治算法,本题还可以用动态规划求解。本题的最优解包含其子问题的最优解,具
有最优子结构性质。
thissum(i)表示以i为起点的最大连续下标最大的和,而maxsum(i)表示前i个元素的最大子数组的和。有递归式:
thissum(i)=max(a[i],thissum(i-1)+a[i]);
maxsum(i)=max(maxsum(i-1),thissum(i+1))。
#include <iostream> #include <limits.h> #include <stdio.h> int a[1000000],b[1000000]; using namespace std; int maxsubnum(const int a[],int n); int main() { int n; while(~scanf("%d",&n)){ for(int i=0;i<n;i++) cin>>a[i]; for(int j=1;j<=n;j++) b[j-1]=a[j]-a[j-1]; int h=maxsubnum(b,n-1); if(h>0) cout<<h<<'\n'; else cout<<"No solution"<<'\n'; } } int maxsubnum(const int a[],int n) { int thissum,maxsum,j; thissum=maxsum=0; for(j=0;j<n;j++) { thissum+=a[j]; if(thissum>maxsum) maxsum=thissum; else if(thissum<0) thissum=0; } return maxsum; }
相关文章推荐
- 【BZOJ1855】股票交易(动态规划,单调队列)
- [bzoj1855][Scoi2010]股票交易_动态规划_单调队列
- 股票交易日(动态规划)
- 【BZOJ1855】股票交易(动态规划,单调队列)
- BZOJ 1855 [Scoi2010]股票交易 ——动态规划
- 双赢策略股票撮合成交系统|股票在线交易系统|股票点买系统
- 股票自动化交易简化版
- [LeetCode] 714. Best Time to Buy and Sell Stock with Transaction Fee 买卖股票的最佳时间有交易费
- 股票证券交易术语
- 股票买卖盘交易深度图
- 股票分仓软件,股票资管软件,股票在线交易系统,股票点买系统
- 假如一个数组存储了一个股票,在一天交易窗口内各时间点的股票价格(正整数),只允许一次买入和一次卖出,请提供一个算法,计算出通过买入和卖出可以得到的最大利润
- 【笔记】菜鸟制作:设计股票交易数据在MYSQL中的表设计(表结构复制、表数据复制)
- 利用bs4和requests爬取股票历史交易数据
- 腾讯股票实时交易数据的接口
- python 获取股票的交易数据
- 递归,分治算法,动态规划和贪心选择的区别
- 个人写的股票智能交易系统,让自动买卖股票不是梦
- 获取股票实时交易数据的方法