tag5:动态规划 爬楼梯+打家劫舍

1、爬楼梯

leetcode70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2

输出: 2

解释: 有两种方法可以爬到楼顶。

1.  1 阶 + 1 阶

2.  2 阶

示例 2:

输入: 3

输出: 3

解释: 有三种方法可以爬到楼顶。

1.  1 阶 + 1 阶 + 1 阶

2.  1 阶 + 2 阶

3.  2 阶 + 1 阶

思路:当前台阶总方式为减少一阶和减少二阶的总数和。

代码如下:

class Solution:

    def climbStairs(self, n: int) -> int:

        if n==1:

            return 1

        result=[]

        result.append(1)

        result.append(2)

        for i in range(2,n):

            result.append(result[i-1]+result[i-2])

        return result[n-1]


2、打家劫舍

leetcode198. 打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1]

输出:4

解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。

     偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:[2,7,9,3,1]

输出:12

解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。

     偷窃到的最高金额 = 2 + 9 + 1 = 12 。

思路:动态规划,产生新的数组保存当前最大值。

class Solution:

    def rob(self, nums: List[int]) -> int:

        if len(nums)==0:

            return 0

        result=[]

        result.append(nums[0])

        if len(nums)==1:

            return result[-1]

        tmp1=nums[0]

        tmp2=nums[1]

        smax=max(tmp1,tmp2)

        result.append(smax)

        for i in range(2,len(nums)):

            smax1=result[i-2]+nums[i]

            smax2=result[i-1]

            smax=max(smax1,smax2)

            result.append(smax)

        return result[-1]


1、最大子序和

leetcode53. 最大子序和

2、买卖股票的最佳时机

leetcode121. 买卖股票的最佳时机

3、爬楼梯

leetcode70. 爬楼梯

4、打家劫舍

leetcode198. 打家劫舍

你可能感兴趣的:(tag5:动态规划 爬楼梯+打家劫舍)