我这里写两道题,一题是单纯的爬楼梯,数总数,另一道是最小消耗爬楼梯。
思路过程: 我借鉴了一位大佬的思路,要爬第n阶,那么有第n-1和第n-2这两种到达方法,注意看他给的实例: 容易得出 f(n)=f(n-1)+f(n-2)
先放上我写的代码:
class Solution:
def climbStairs(self, n):
arr=[-1]*(n+1);arr[1]=2;arr[0]=1
for i in range(2,n+1):
arr[i]=arr[i-1]+arr[i-2]
return arr[n-1]
循环思路构思: 我们算的是到达第n阶,那么为了给他赋值,i在数组要取到n+1;arr数组长度也取到n+1
第二点,楼梯的n题目明确给定正整数,也就是n>=1
总的来说,这题比较简单,没有下面这题有深度。。
思路过程:最小花费这应该是迷你版的打家劫舍;;照葫芦画瓢,递归和记忆化存储两种都过了。。代码我放在文最下面
递归这里超时了,过了85%的数据
我写这种决策题还是先画图:
画图分析:容易发现,画星星的地方都是重复的子问题,另外可以看到找5的最小消耗就要找4的最小消耗或者3的最小消耗,根据这点来写循环
循环分析: 路线在当前决策上一阶或两阶,所以,范围为(i,i+2);递归每次加1;所以,dp(cost,j+1)
记忆化写法:
class Solution:
def minCostClimbingStairs(self, cost):
i=0
memo=[-1]*len(cost)
def dp(cost,i):
if i>=len(cost)-1:
return 0
if memo[i]!=-1:
return memo[i]
res=1000000
for j in range(i,i+2):
res=min(res,cost[j]+dp(cost,j+1))
memo[i]=res
return res
return dp(cost,0)
循环分析: 之前写过了,吧值存到memo数组中,然后打表;写的时候容易犯错在memo[i]=res;而不是memo[j]=res;
递归代码:
class Solution:
def minCostClimbingStairs(self, cost):
i=0
def dp(cost,i):
if i>=len(cost)-1:
return 0
res=1000000
for j in range(i,i+2):
res=min(res,cost[j]+dp(cost,j+1))
return res
return dp(cost,0)