
class Solution: def climbStairs(self, n: int) -> int: # 状态 dp[i] 爬i阶的方法数 # if n <= 1: # return n dp = [0 for i in range(n + 1)] choices = (1, 2) # dp[1] = dp[2] = 1 for i in range(1, n + 1): for c in choices: if i - c < 0: continue dp[i] = max(dp[i] + dp[i - c], dp[i] + 1) # dp[i] = dp[i-1] + dp[i] print(dp[n]) return dp[n]if __name__ == '__main__': s = Solution() s.climbStairs(0)
总结
- 有点像完全背包问题。
- 相同点
- 不同点
- 爬楼梯问题 相同选择周期出现,
- 完全背包问题 选择是会被消费的。
- 有点像找零钱问题
- 相同点
- 找零钱记录少零钱方案, 转移方程是dp[i] =max(dp[i-n]) + 1, n为面值
- 爬楼梯记录所有方案,, 转移方程 dp[i] = sum(dp[i-n])
- 可以用斐波那契数列求解