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

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;


}


全部评论

相关推荐

一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务