[DP]一道动态规划——理想收入问题
2010-09-17 18:01
232 查看
上午在图书管从吴文虎教授的那本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问题通过分析,我们都可以利用一些变量的关系来简化公式,或者降低时空复杂度,有时候转化一下思想也能达到同样效果,这就要就我们对一个问题做比较深入的分析,多思考,多总结,打破常规,才能得到进步!
题意:以一元为本金,能获得的最大收入,第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问题通过分析,我们都可以利用一些变量的关系来简化公式,或者降低时空复杂度,有时候转化一下思想也能达到同样效果,这就要就我们对一个问题做比较深入的分析,多思考,多总结,打破常规,才能得到进步!
相关文章推荐
- leetcode 213. House Robber II 入室抢劫 抢劫问题 + 一道经典的DP动态规划问题
- HDU5860(约瑟夫环问题。超级牛B的动态规划思维题,DP嘛,推出递推式谁不会写)
- 动态规划和背包dp问题
- 华为校招第三题:字符串变换最小费用(动态规划DP问题)
- 背包问题(dp动态规划思路详解)
- 动态规划(Dynamic programming,DP),通过把原问题分,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:
- 动态规划(DP)的例题:动态规划的几类问题
- 动态规划DP问题分类和经典题型
- 最优配对问题(集合上的动态规划) —— 状压DP
- DP动态规划问题(1)
- leetcode 174. Dungeon Game 一个逆着推导计算的DP动态规划问题
- 动态规划问题_dp
- 华为训练题目:初级——合唱队(递增子序列,DP动态规划问题)
- leetcode 53. Maximum Subarray(DP动态规划问题)
- DP动态规划_01背包问题
- 动态规划解TSP问题(状态压缩dp)
- dp 数塔 经典动态规划问题
- Sicily 1146 采药(DP动态规划——01背包问题)
- HDU 2159 FATE (动态规划dp之二维完全背包问题)
- 程序设计实习动态规划练习 Charm Bracelet(0/1背包问题dp)