股市的交易日(动态规划算法)

3 篇文章 0 订阅

股市的交易日


///
/// 在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行)。给出一天中的股票变化序列,请写一个程序计算一天可以获得的最大收益。
///给定价格序列prices及它的长度n,请返回最大收益。保证长度小于等于500。
///测试样例:
///[10,22,5,75,65,80],6
///返回:
///87
///

想法:

最多两次交易,前一次交易与后一次交易的结果想加,有关联,所以选用 动态规划算法

把序列分为两段

10 ||22 5 75 65 80
10 22||5 75 65 80
10 22 5||75 65 80

计算前一段跟后一段的最优解相加最优

c# 代码1

///使用: 
/// int[] prices = { 10,2,5,75,65,80,5,6 };
/// int max = maxProfit2(prices, prices.Length);
///方法:
 static int maxProfit2(int[] prices, int n)
        {
            Console.WriteLine("maxProfit2");
            int times = 0;
            int max = 0;
            int onemax = 0, twomax = 0;
            for (int i = 0; i < n; i++)
            {
                onemax = 0; twomax = 0;
                for (int j2 = 0; j2 < i; j2++)
                {
                    for (int j3 = j2; j3 < i; j3++)
                    {
                        times++;
                        int vTmp = prices[j3] - prices[j2];
                        if (vTmp > onemax)
                        {
                            onemax = vTmp;
                        }
                    }
                }

                for (int k2 = i; k2 < n; k2++)
                {
                    for (int k3 = k2; k3 < n; k3++)
                    {
                        times++;
                        int vTmp = prices[k3] - prices[k2];
                        if (vTmp > twomax)
                        {
                            twomax = vTmp;
                        }
                    }
                }
                Console.WriteLine(onemax + "--"+ twomax);
                int tmpMax = onemax + twomax;
                if (max < tmpMax)
                {
                    max = tmpMax;
                }
            }
            Console.WriteLine("maxProfit2-end:" + times);
            return max;
        }

c# 代码2

///使用: 
/// int[] prices = { 10,2,5,75,65,80,5,6 };
/// int max = maxProfit3(prices, prices.Length);
///方法:
static int maxProfit3(int[] prices, int n) 
        {
            Console.WriteLine("maxProfit3");
            int max = 0;
            int times = 0;
            int onemax, twomax;
            for (int i = 0; i < n; i++)
            {
                onemax = 0; twomax = 0;
                for (int j = 0; j < i; j++)
                {
                    for (int j2 = 0; j2 < j; j2++)
                    {
                        times++;
                        int tmpPri = prices[j] - prices[j2];
                        if (tmpPri > onemax)
                        {
                            onemax = tmpPri;
                        }
                    }

                }
                for (int k = i + 1; k < n; k++)
                {
                    times++;
                    if ((prices[k] - prices[i]) > twomax)
                    {
                        twomax = prices[k] - prices[i];
                    }
                }
                Console.WriteLine(onemax + "--" + twomax);
                int tmpMax = onemax + twomax;
                if (tmpMax > max)
                {
                    max = tmpMax;
                }
            }
            Console.WriteLine("maxProfit3-end:" + times);
            return max;
        }
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态规划算法是一种解决最优化问题的算法,它在许多应用中都能得到成功的应用,其中之一就是投资问题。 假设有一个投资者想要在股市中进行投资,他有一定的资金,并且希望通过投资获得最大的收益。这个问题可以看作是一个动态规划问题,下面我们来看一个具体的案例分析。 假设投资者有1万元的资金,他希望在A股市场和B股市场中进行投资。他可以按照不同的比例投资,比如说他可以将5000元投资到A股市场,将5000元投资到B股市场,也可以将6000元投资到A股市场,将4000元投资到B股市场等等。 现在假设投资者有以下的投资方案: | 方案 | A股市场 | B股市场 | | --- | --- | --- | | 方案1 | 5000元 | 5000元 | | 方案2 | 6000元 | 4000元 | | 方案3 | 7000元 | 3000元 | | 方案4 | 8000元 | 2000元 | | 方案5 | 9000元 | 1000元 | | 方案6 | 10000元 | 0元 | 假设在A股市场中,每投资1000元可以获得800元的回报,而在B股市场中,每投资1000元可以获得600元的回报。根据这些数据,我们可以计算出每种方案的预期收益: | 方案 | A股市场回报 | B股市场回报 | 预期收益 | | --- | --- | --- | --- | | 方案1 | 4000元 | 3000元 | 7000元 | | 方案2 | 4800元 | 2400元 | 7200元 | | 方案3 | 5600元 | 1800元 | 7400元 | | 方案4 | 6400元 | 1200元 | 7600元 | | 方案5 | 7200元 | 600元 | 7800元 | | 方案6 | 8000元 | 0元 | 8000元 | 现在,我们可以使用动态规划算法来寻找最优的投资方案。我们可以定义一个状态方程,假设在第i个方案中,投资了x元在A股市场,那么就可以计算出在第i个方案中,投资了(10000-x)元在B股市场。因此,我们可以定义状态方程为: f(i,x) = max{f(i-1,x) + Ai * (x/1000), f(i-1,x-1000) + Bi * [(10000-x)/1000]} 其中,f(i,x)表示在前i个方案中,投资了x元在A股市场所能获得的最大收益,Ai表示在A股市场中每投资1000元所能获得的回报,Bi表示在B股市场中每投资1000元所能获得的回报。 根据上述状态方程,我们可以使用动态规划算法来计算出最优的投资方案。具体的算法流程如下: 1. 初始化f(0,x) = 0,表示在前0个方案中,无论如何投资都无法获得收益。 2. 对于每个方案i,在0到10000元之间枚举投资在A股市场的金额x,计算出f(i,x)的值。 3. 根据计算出的f(i,x)的值,可以得到在第i个方案中投资在A股市场所能获得的最大收益f(i,10000)。 4. 最终的最大收益即为f(6,10000)。 通过这种方式,我们可以求出最优的投资方案,从而帮助投资者获得最大的收益。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值