714. 买卖股票的最佳时机含手续费 python解法(初探DP)

题目如下

Leetcode:#714. 买卖股票的最佳时机含手续费
在这里插入图片描述
  这道题,我想说开始我并不是想用DP的方法来的,因为最近正在从贪心算法开始起,所以并没有想说接触到动规,所以在leetcode上面也是选了贪心算法的标签然后开始写的。但是想想其实贪心和动归有着异曲同工之妙,首先去学习了大佬对于动规和贪心的理解。
  概括一下两者的本质区别:站在全局角度来看,对于每个可选项,贪心算法是只保留一种决策(要么最优,要么非最优) ,动态规划保留了它的一个决策集,从中取最优。
  大白话就是:贪心只考虑最后那次状态,但是动规是要考虑前面的每一次的状态
  显然对于这道题,我觉得贪心不行(大佬勿喷,我是单纯考虑不到贪心的解法),在我粗浅的认识里面,如果是贪心,每次只要有利润的话就交易,会导致交易的次数变多,也就会浪费无数的手续费,所以我做不来了。
  然后绞尽脑汁,最终屈服于评论区里面了。
  看了好多解析,还是觉得动规真厉害。
不多bb,直接上代码:

class Solution:
    def maxProfit(self, prices: List[int], fee: int) -> int:
        dp = [[0,0] for i in range(len(prices))]
        dp[0][0] = 0
        dp[0][1] = -fee - prices[0]
        for i in range(1,len(prices)):
            dp[i][0] = max(dp[i - 1][0],dp[i - 1][1] + prices[i])
            dp[i][1] = max(dp[i - 1][1],dp[i - 1][0] - prices[i] - fee)
        return(dp[len(prices) - 1][0])

代码以及思路解析:
  首先,你得考虑这题有哪些要素。捋一捋,得有个天数表示吧,得知道哪天到底买了股票没有吧。当然因为这道题没有严格限制交易次数,所以不加以考虑。粗略的先写出得有个dp[i][0]和dp[i][1]吧,一个表示那天买了股票,一个表示没买。

  其次还得知道两个重要的点,状态转移方程以及初始状态。其实初始状态应该好考虑。第一天你买了股票,是不是得花钱,然后我们定义在买的时候交手续费,卖的时候不交了(相反也行),是不是就是:-fee - prices[0]。而第一天没买股票,就零蛋。

  状态转移方程对于这道题也是再简单不过了,第二天的状态有两种,都是由第一天决定的。第二天没股票,要不第一天压根没买,要么第一天买了你给卖了。从中取高。毕竟咱得赚钱撒。同理第二天有股票,要不第一天的股票买了放那的,要不没买今儿个买的。(注意:买的时候记得交了手续费再比较)

写在最后:如果你看懂了就可以再看看之后我写的话,没看懂还是先看懂,不懂的评论,我尽量给你把这题讲懂。对于动规和贪心这种题目,个人还是建议多见题型,多练。尤其动规,核心就是个转换方程,有时候就那么两行,你就是写不出来,你说气人不- -.。就算知道大多数动规解题方法的,遇到很复杂的题目或者新颖的也会懵住。老生常谈了,多练。当然,那个知道大多是方法的肯定不是我,是我一个ACM区域赛银奖的朋友告诉我的,所以我可没瞎编哦!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值