使用最小代价爬楼梯

你需要爬上一个N层的楼梯,在爬楼梯过程中, 每阶楼梯需花费非负代价,第i阶楼梯花费代价表示为cost[i], 一旦你付出了代价,你可以在该阶基础上往上爬一阶或两阶。

你可以从第 0 阶或者 第 1 阶开始,请找到到达顶层的最小的代价是多少。

N和cost[i]皆为整数,且N∈[2,1000],cost[i]∈ [0, 999]。

输入描述:

输入为一串半角逗号分割的整数,对应cost数组,例如

10,15,20

输出描述:

输出一个整数,表示花费的最小代价

输入例子1:

1,100,1,1,1,100,1,1,100,1

输出例子1:

6

这里花费应该理解为站在该台阶上就要付费,令dp[i] 表示爬到第i个台阶所花的最小费用,dp[0]=cost[0], dp[1]=cost[1]

dp[i] = min(dp[i-2],dp[i-1]) + cost[i]

这里需要特别注意的是,需要在cost数组中添加一个0元素,表示站在顶层所需要的费用。这样是为了处理从第n-1个台阶爬两步的情况。

算法代码

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) 
    {
        int n = cost.size();
        vector<int> dp(n+1,0);
        cost.push_back(0);                // 这一步非常精髓
        dp[0] = cost[0];
        dp[1] = cost[1];
        for(int i=2;i<=n;i++)
            dp[i]=min(dp[i-2],dp[i-1])+cost[i];
        return dp[n];
    }
};

这里麻烦的是还要处理字符串输入,直接使用Python的split函数和map函数将输入变为整形数组

cost = input().split(",")
cost = list(map(int, cost))
cost.append(0)
n = len(cost)
dp = [0 for i in range(n)]
dp[0] = cost[0]
dp[1] = cost[1]
for i in range(2, n):
    dp[i] = cost[i] + min(dp[i - 2], dp[i - 1])
print(dp[n - 1])

 

点赞