Leetcode刷题全记录,每题都有长进(medium 301-330)

309. 含有冷冻期的股票购买

在这里插入图片描述股票问题是一类典型的dp问题,这个链接对于题目进行了讲解。
作为补充,我也整理一下自己的解题思路.
因为做过类似的题目所以对采用dp思想还是明确的。由于存在两个状态,持有股票持有现金因此要采用二维的方式。

  • 状态设定:dp表示现金存量。dp[i][1],表明在第i天持有股票的状态。dp[i][0]表明在第i天持有现金的状态。
  • 状态转移方程:由于添加了冷冻期限,只能在前前一天没有持有的前提下才能买入。dp[i][0] = max(dp[i-1][1]+prices[i-2], dp[i-1][0])h和dp[i][1] = max(dp[i-2][0]-prices[i-2], dp[i-1][1])
  • 初始状态:需要考虑初始时只能买进不能卖出,两者状态下的初始值设定不同。[0, float('-inf')]。这个设定限制了不能再第一天就卖出。
  • 卖出股票+price,买入-price
class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        dp = [[0, float('-inf')] for _ in range(len(prices)+2)]
        for i in range(2,len(prices)+2):
            dp[i][0] = max(dp[i-1][1]+prices[i-2], dp[i-1][0])
            dp[i][1] = max(dp[i-2][0]-prices[i-2], dp[i-1][1])
        return dp[-1][0]

322. 零钱对换

在这里插入图片描述一道类似的背包问题,但是也是动态规划的经典题目。
子问题就是不断的减少需要的金额总数。

class Solution(object):
    def coinChange(self, coins, amount):
        """
        :type coins: List[int]
        :type amount: int
        :rtype: int
        """
        dp = [float('inf')]*(amount+1)
        dp[0] = 0
        for i in range(1,amount+1):
            for j in coins:
                if j<=i:
                    dp[i] = min(dp[i], dp[i-j]+1)
        if dp[-1] == float('inf'):
            return -1
        return dp[-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值