你需要爬上一个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])