题目描述:
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
示例 1:
示例2:
提示:
代码:
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n=cost.size();
int dp[n+1];
if(n==0)return 0;
if(n==1)return cost[0];
memset(dp,0,sizeof(dp));
for(int i=2;i<=n;i++){
dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return dp[n];
}
};
典型的动态规划,写出状态转移方程,dp[i]表示到达第i层所需要的最小花费,到达第i层有两种方法:从(i-1)层上一层到第i层,或从第(i-2)层上两层到达第i层,第i层的最小花费选取两种方案中的最小值,即:
dp[i] = min( dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])
观察示例1:从第0层开始到达顶楼的花费为cost[0]=10,从第1层开始到达顶楼的花费为cost[1]=15,但输出结果为15,说明到达顶楼不是指到达第n-1层。若考虑到达顶楼是指到达第n层,则从第0层到达第n层花费为cost[0] + cost[2] = 10 + 20 = 30,从第1层到达第n层花费为cost[1] = 15 < 30,与示例输出相同。
所以题目到达顶楼的意思为到达第n层而非第n-1层。
注意:
题目用非逻辑形式表达的定义可能表意不清,需要用示例判断具体的定义。