算法导论 分治 股票(不理解,请留下评论,必回)

1;问题描述 每日股票都有波动,假设能未卜先知,请问,哪天买入,哪天卖出,利益最大化。(下面只求解了利益最大化的值,若想知道哪天买入,哪天卖出,即下标,请留下评论,本人将用返回结构体地址解决此问题)

    int sz[16] = { 13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};//每天的涨跌状态。
2;问题分析,该问题的规模是n,将其分解,为right(n/2),left(n/2)centre(n){centre的规模还是n,但是加了限制条件,必须经过中心点}
3;代码附上。
#define _CRT_SECURE_NO_WARNINGS
#include<math.h>
#include<stdio.h>
int divide(int* p, int left, int right);
int centre(int* p, int left,int mid, int right);
int main()
{
    int p;
    int sz[16] = { 13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
    p=divide(sz, 0, 15);
    printf("%d", p);
    return 0;
}

int divide(int p[4], int left, int right) 
{
    if (left == right) return p[left];
    int mid = (right + left) / 2;
    int l =divide(p, left, mid);//左半边
    int r =divide(p, mid+1, right);//右半边
    int c=centre(p, left,mid, right);//跨越中间
    int max = l > r ? l : r;
    max = max > c ? max : c;//找出最大值
    return max;
}
int centre(int p[4], int left,int mid, int right) 
{
    int r_sum=0, r_max=~(((unsigned)-1)>>1), r_sub;
    int l_sum=0, l_max=~(((unsigned)-1) >> 1), l_sub;
    for (int i = mid; i >= left; i--) {
        l_sum += p[i];
        l_sum > l_max ? l_max = l_sum : l_max;
    }
    for (int i = mid+1; i <= right; i++) {
        r_sum += p[i];
        r_sum > r_max ? r_max = r_sum : r_max;
    }
    return l_max + r_max;


}


全部评论

相关推荐

头像
10-09 19:35
门头沟学院 Java
洛必不可达:java的竞争激烈程度是其他任何岗位的10到20倍
点赞 评论 收藏
分享
一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务