zoukankan      html  css  js  c++  java
  • [DP]一道动态规划——理想收入问题

    上午在图书管从吴文虎教授的那本ACM/ICPC高级教程上看了一道题,虽说不上经典,但其中的思想还是可以借鉴的。

    题意:以一元为本金,能获得的最大收入,第i天股票价格为v[i],1<=i<=m

    思路:

      (1)DP思路明显,直接进行动态规划,令f[i]代表第i天所获得的最大收入.那么有公式:

        f[i] = max{f[i-1],f[j]*v[i]/v[j]} (1<=j<i)

    其中f[i-1]代表不在第i天卖掉股票,f[j]*v[i]/v[j]代表从第j天买进,第i天卖出的情况,显然,以上情况便包括了所有的情形。分析可知,此算法的时间复杂度为O(n*n),空间复杂度为O(n).

      (2)经过分析可以发现,公式f[j]*v[i]/v[j]中对于确定的i,v[i]是不变的,所以我们只需要找到f[j]/v[j]的最大值即可,进而可以发现,对于每次i循环,找到最大的f[j]/v[j]仅仅需要O(1)的复杂度,为什么呢?因为j的范围是[1,i-1],而f[j]/v[j]是不变的,所以每次循环结束我们只需要记录下f[j]/v[j] (1<= j < i)的最大值即可,这样我们便消除了j的循环操作,时间复杂度降为O(n),又因为可以边输入,边处理,所以空间复杂度降为O(1).

    总结:

      至此,此题通过分析,时间复杂度降为O(n),空间复杂度降为O(1),问题得到比较好的解决,不仅是本题,很多DP问题通过分析,我们都可以利用一些变量的关系来简化公式,或者降低时空复杂度,有时候转化一下思想也能达到同样效果,这就要就我们对一个问题做比较深入的分析,多思考,多总结,打破常规,才能得到进步!

  • 相关阅读:
    Collection和Collections的区别
    Demo小细节-1
    一道关于String的面试题,新鲜出炉,刚被坑过,趁热!!
    System.gc()与Object.finalize()的区别
    释放对象所占用的内存
    Java接口中的成员变量默认为(public、static、final)、方法为(public、abstract)
    纸牌游戏——队列和栈的应用
    Vue过渡动画运用transition
    SpringBoot整合Redis注意的一些问题
    Spring的Bean的生命周期
  • 原文地址:https://www.cnblogs.com/lvpengms/p/1829530.html
Copyright © 2011-2022 走看看