动规开始
动归:有很多重叠子问题--状态能顺次推导,后一个动作受到前面动作的影响
(比如前一个动作占了背包的空间 后一个动作受剩下的空间的限制
贪心:每次都是取最小 不受挤压空间干扰)
DP的debug:推导DP数组--print出来看是否符合预期
09. 斐波那契数
只需要维护2个数 就一直往前移动 我感觉这个我写的很好看
class Solution:
def fib(self, n: int) -> int:
if n<=1: return n
dp0,dp1=0,1
for i in range(2,n+1):
dp0,dp1=dp1,dp0+dp1
return dp1
和上一题其实一样 但0也是一种走法
class Solution:
def climbStairs(self, n: int) -> int:
dp0,dp1=1,1
for i in range(2,n+1):
dp0,dp1=dp1,dp0+dp1
return dp1
不跳步版本:dp[n]=dp[n-1]+dp[n-2]
class Solution:
def climbStairs(self, n: int) -> int:
if n<=1: return n
dp1,dp2=1,2
for i in range(3,n+1):
dp1,dp2=dp2,dp1+dp2
return dp2
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
dp0,dp1=0,0
for i in range(2,len(cost)+1):
dpi=min(dp1+cost[i-1],dp0+cost[i-2])
dp0,dp1=dp1,dpi
return dp1