动态规划的实现(二)---LeetCode面试题08.01与17.16

08.01三步问题

  • ## 主要思路:

假设现在求到i阶阶梯的方法种数dp[i],可以考虑它的上一步,分为三种情况:从i-1阶迈一步到达,i-1阶的方法数dp[i-1]; 从i-2阶一次上2阶到达,方法数dp[i-2]; 从i-3阶一次上3阶到达,方法数dp[i-3]。 因此dp[i]=dp[i-1]+dp[i-2]+dp[i-3]为状态转移方程。

class Solution:
    def waysToStep(self, n: int) -> int:
        if n<3:
            return n
        if n==3:
            return 4
        dp=[0]*(n+1)
        dp[0],dp[1],dp[2],dp[3]=0,1,2,4
        for i in range(4,n+1):
            dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%1000000007
        return dp[n]

17.16 按摩师

主要思路:
dp[i-1]代表请求序列长度为i时的最优解,也就是最长分钟数。
序列长度为1时,dp[0]=nums[0]
序列长度为2时,dp[1]=max(nums[0],nums[1])
序列长度为3时,dp[2]=max(nums[1],nums[0]+nums[2]) //因为要保证不能相邻,所以三个元素要么选中间一个,要么选第一个与第三个的和,两者比较选最大值
序列长度为4时,dp[3]=max(dp[2],dp[1]+nums[3]) 如果选择nums[3],nums[2]一定不能选,最大长度为0~1 的最大长度即dp[1]加上nums[3];如果不选nums[3],最大长度即为0~2 的最长时间dp[2];两种情况选择最大。
状态转移方程为dp[i]=max(dp[i-1],dp[i-2]+nums[i])。

class Solution:
    def massage(self, nums: List[int]) -> int:
        if not nums:
            return 0
     
        dp=[0 for _ in nums]
        if len(nums)==1:
            return nums[0]
        if len(nums)==2:
            return max(nums[1],nums[0])
        dp[0]=nums[0]
        dp[1]=max(nums[1],nums[0])
        for i in range(2,len(nums)):
            dp[i]=max(dp[i-1],dp[i-2]+nums[i])
        return dp[-1]

自己写的有点复杂,看了官方的答案,果然够简洁又明了

class Solution:
    def massage(self, nums: List[int]) -> int:   
        last,now=0,0
        for num in nums:
            last,now=now,max(last+num,now)
        return now


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值