动态规划

本文深入解析了多种经典算法问题的高效解决策略,包括爬楼梯问题的动态规划解法,最大子数组和问题的分治与动态规划方法,股票买卖最佳时机问题的动态规划算法,以及打家劫舍问题的动态规划优化方案。通过这些实例,展示了如何运用动态规划、分治等算法技巧来优化代码效率,提高问题解决能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

解法
class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n==0 or n==1:
            return 1
        a,b=1,2
        while n>2:
            a,b=b,a+b
            n-=1
        return b

在这里插入图片描述

解法一:
class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        sum=0
        max_sub_sum=nums[0]
        for num in nums:
            sum=sum+num
            if sum >max_sub_sum:
                max_sub_sum=sum
            if sum<0:
                sum=0
        return max_sub_sum
        -2——>1—— -3——4—— -1——2——1—— -5——4

sum -2 1 -3 4 3 5 6 1 3
max 1 1 4 4 5 6 6 6 6

解法二
class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums)==0:
            return None
        import sys        
        res=nums[0]
        f_n=-1
        for i in nums:
            f_n=max(i,i+f_n)
            res=max(res,f_n)
        return res

在这里插入图片描述

解法一
class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        if len(prices)==0:
            return 0
        minValue=prices[0]
        maxdiff=0
        for i in range(1,len(prices)):
            if prices[i]<minValue:
                minValue=prices[i]
            else:
                diff=prices[i]-minValue
                maxdiff=max(diff,maxdiff)
        return maxdiff
解法二
class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
		min_price = float('inf')
        max_profit = 0
        
        for price in prices:
            if price < min_price:
                min_price = price
            elif (price - min_price) > max_profit:
                max_profit = price - min_price
        return max_profit

在这里插入图片描述

解法一
class Solution(object):
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 0:
            return 0
        D = [0 for _ in nums]
        for index,num in enumerate(nums):
            if index == 0:
                D[index] = num
            elif index == 1:
                D[index] = max(D[index-1],num)
            else:
                D[index] = max(D[index-2]+num,D[index-1])
        return D[-1]
        
解法二
class Solution(object):
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums)==0:
            return 0
        memo=[]
        memo.append(nums[0])
        for i in range(1,len(nums)):
            current=nums[i]+memo[i-2] if i-2>=0 else nums[i]
            pre=nums[i-1]+memo[i-3] if i-3>=0 else nums[i-1]
            memo.append(max(current,pre))
        return memo[-1]

算法的主要思想是拿当前元素值nums[i]与记录值memo[i-2]相加对比nums[i-1]与memo[i-1-2]相加的结果取最大值。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值