LeetCode动态规划总结

1.打家劫舍

给定一个数组nums,代表每家可以打劫到的钱数,连着打劫相邻的两家会自动报警。在保证不报警的前提下,找到可以打劫到的最多钱数。

解:这道题的本质是在一列数组中取出一个或多个不相邻数,使其和最大。

这类求极值的问题可以先考虑动态规划。dp[i]表示第i位置时最大金额,

dp[0]=nums[0],

dp[1]=max{nums[0],nums[1]},

dp[2]=max{dp[0]+nums[2],dp[1]}

....

dp[i-1]=max{dp[i-2]+nums[i-1],dp[i-1]}

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

2.

你可能感兴趣的:(LeetCode动态规划总结)