目录
题目:
示例:
分析:
代码:
题目:
示例:
分析:
题目给我们一个数组,第i个数表示在第i个台阶起步所需的花费。我们可以从下标为0或是1的台阶出发,问我们最终到达顶部所需花费的最小代价。
首先有两个点要提前说明,第一是我一开始站到0或是1的台阶是不需要花费的。我从0或1出发,才需要花费对应的代价。
第二就是cost花费数组的长度为n,则我们需要达到的顶层是n+1。
我们每次可以跨1~2节台阶,所以如果我们要走到第k节台阶,则有两种选择,一种是从k-1节台阶跨一节台阶,或者是从k-2节台阶跨两节台阶上来。
花费分别是 到达k-1节台阶的花费+cost[ k-1 ] , 到达k-2节台阶的花费+cost [ k - 2 ]
至此,我们发现了规律,也就是递推公式,所以我们直接使用dp数组来进行动态规划,dp[ i ]的含义就是到达第i节台阶所需的花费。由于我们一开始说了,我们最终需要到达的台阶是n+1层,所以dp数组的长度就应该是n+1而不是n。
关于dp数组的初始化,我们一开始也说了,只有从台阶起步,我们才会需要花费,因为我们在0或1节台阶上的花费都是0,直接初始化这俩为0就可以开始递推了。
最终返回dp数组的最后一个元素即可。
代码:
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int>dp(cost.size()+1,0);
for(int i=2;i<cost.size()+1;i++){
dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return *(dp.end()-1);
}
};