题目要求:思路:动态规划中当前楼梯消耗体力的最小值是前一个楼梯和前两个楼梯中较小的一个加上当前楼梯所需的体力值。维护一个数组dp,保存所有上台阶需要花费的体力值,初始化前两个元素,第一个元素为0,第二个元素为上第一步需要的体力值遍历数组,从1的下标位置,因为下标0位置的元素,即第一步的物理值已经保存在数组中。遍历完后,数组末尾的两个元素dp中较小的那个元素代价最小,因为从dp[-1]可以一步到梯子顶端,而dp[-2]的元素也可以一步到梯子的顶端。核心代码:dp=[0,cost[0]]foriinrange(1,len(cost)):dp.append(min(dp[i]+cost[i],dp[i-1]+cost[i]))returnmin(dp[-1],dp[-2])完整代码:classSolution:defminCostClimbingStairs(self,cost:List[int])->int:ifnotcost:return0dp=[0,cost[0]]foriinrange(1,len(cost)):dp.append(min(dp[i]+cost[i],dp[i-1]+cost[i]))returnmin(dp[-1],dp[-2])因为只有上一步和第一步需要两步,可以维护两个值而不是一个数组:classSolution:defminCostClimbingStairs(self,cost:List[int])->int:ifnotcost:return0pre,cur=0,cost[0]dp=[0,cost[0]]foriinrange(1,len(cost)):pre,cur=cur,min(pre+cost[i],cur+cost[i])返回min(pre,cur)
