说实话,我只知道一个关于动态编程的概念。有时我不知道动态编程的算法,所以我试着用一种流行的方式来讨论它。
动态规划的一个条件是,问题可以分为同一类问题,这是类似于递归算法。它也注意到,如果该子问题的最优解是重要的,那么问题的解是最优的(如果有错误欢迎)校正。
解决这个问题有两种方法。第一个是寻找峰值和波谷,这对于主题来说太低效了,所以只需谈论一下想法。
第一思路
如上图所示,峰谷差是交易中可以获得的利润。比较每一个值,可以得到峰值和谷值之间的最大差值,即最大利润值。这里有一个简单的方法来找到槽峰:第一时刻,下降趋势转为上升趋势是低谷,而第一时刻,上升趋势转为下降趋势的高峰。但在这种情况下,我们必须注意处理各种特殊情况。逻辑判断的嵌套顺序是非常重要的,因此不推荐这种方法。
其次是第二种思维方式,即动态规划方法。第一粘贴代码:
类解{
公众:
Int maxProfit(向量<int>价格){
如果(Prsiess)(空)返回0;
向量<int>生长;
对于(int i=0;i<psisies)(1);++i)
增长率(价格(I+1)-价格<I>);
最大利润=0;
INT利润=0;
对于(int i=0;i<成长ths();++i){
如果(利润+增长<I>>0)
利润=增长[I];
否则
利润=0;
如果(利润大于最大利润)
利润最大化=利润;
}
返回最大利润;
}
};
理解算法,我们首先需要明确的是,买和卖可以分为购买和销售连续几天。例如,在购买和出售的第一天,在第三天可以分为在第一天买的,第二天出售,购买第二天销售在第三天。我们把第一天的价格设为MI,利润可以分为(M2-M1)+(M3-M2)(M3-M1)。
在此基础上,我们可以得到该算法的主要步骤:首先,我们分裂的买进和卖出的每一天所有的利润,然后不断地把这些利润。让我们把M(i+1)m i的值设为AI,然后连续的AI就是我们想要的最大利润。
现在的问题是,我们如何得到这段sigma ai?现在我们再从AP到AQ,让P<问我,有三种情况:如果我是积极的,那么AI通过这种方式得到的一定是利润最大的时期是从P到Q;如果爱是消极的,那么我们无论我们怎么买它亏钱,因为价格一直下降;如果AI是假定IVE或负数,然后让我们设置J来做AP+A(P+1)+…+AJ<0,如下图所示。
第三种情况
所以我们可以得出结论,如果利润最大化是[P+(P+1)+]+(j+1)+AQ,显然由于动态规划的知识,甚至连最基本的知识,我们知道,如果这是利润最大化,一个(J+1)+(j+2)+AQ显然会更大,所以如果和积累。负值出现,然后从零开始记录(不影响历史的最大累积总和)。