您的位置:首页 > 其它

股票交易 动态规划 分治算法

2017-04-21 23:46 344 查看
现在,有一份很长很长的连续时间点股票价格数据(按时间从先到后顺序),老板需要你快速的寻找在这段数据范围内一次买卖股票的每股最大收益(假设所有人买卖股票都在给定时间点的数据范围内)。

多组测试数据(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: