1. 程式人生 > >使用最小花費爬樓梯python

使用最小花費爬樓梯python

題目描述:

陣列的每個索引做為一個階梯,第 i個階梯對應著一個非負數的體力花費值 cost[i](索引從0開始)。

每當你爬上一個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬一個階梯或者爬兩個階梯。

您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。

示例1:

輸入: cost = [10, 15, 20]
輸出: 15
解釋: 最低花費是從cost[1]開始,然後走兩步即可到階梯頂,一共花費15。

示例2:

輸入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] 輸出: 6 解釋: 最低花費方式是從cost[0]開始,逐個經過那些1,跳過cost[3],一共花費6。

# -*- coding:utf-8 -*-
#@xinxinzhang
'''
思路:回溯法,設dp[i]為爬第i個臺階花費的體力
則:動態規劃方程:dp[i]=min{dp[i-2]+cost[i-2],dp[i-1]+cost[i-1]}

我的:
def minCostClimbingStairs(cost):
    dp=[0]*(len(cost)+1)
    if len(cost)==2:
        return min(cost[0],cost[1])
    if len(set(cost))==1:
        return cost[0]*(len(cost)//2)
    else:
        for i in range(2,len(cost)+1):
            dp[i]=min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1])
        return dp[-1]
'''
#大神的:
def minCostClimbingStairs(cost):
    f1=f2=0
    for x in reversed(cost):
        f1,f2=x+min(f1,f2),f1#用f1,f2輪流遍歷列表,輪流儲存最小值
    return min(f1,f2)

if __name__=='__main__':
    cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
    print(minCostClimbingStairs(cost))