题目:
给你一个整数数组 cost
,其中 cost[i]
是从楼梯第 i
个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0
或下标为 1
的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
题解:
本题开始真正使用动态规划的知识了,本人也是初次入门,只是即兴写下所学所感,在这过程中可能有出错的地方,欢迎大家一起讨论。
每一次爬楼梯不再像之前爬楼梯那样单纯递推就可求出,而是要在递推的基础上满足整体最优解。
每一次的更新策略是走到本层楼梯应该是从上一步和上两步中花费最少的走上来的。即:
dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
cpp
int minCostClimbingStairs(vector<int>& cost) {
vector<int>dp(cost.size()+1,0);
for(int i=2;i<=cost.size();i++){
dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return dp[cost.size()];
}
写出这道题后让我心里对动态规划和贪心做了个对比,目前得出的结论是:
贪心:在实现每一层时,按一个策略从多个选法中选择最优的,通过局部最优达到整体最优。
动态规划:先把到本层的所有策略都做一遍,然后再从中选择最优的,通过小整体最优得到大整体最优解。