例题四:使用最小花费爬楼梯
题目描述:
跳到顶楼的最小花费多少?
题目理解:
①当人处在下标为i的台阶上不消耗体力值,当人从台阶向上跳时会花费体力值
eg.处在i=1的位置并不耗费体力值15,当从台阶1向上跳时会耗费体力值15
②顶楼的位置在下标3的位置
③可以一次跳一层台阶也可以一次跳两层台阶,求最小的体力耗费
动规五部曲
第一步:确定dp数组的含义
dp[i]:到达i位置花费的体力值dp[i]
第二步:递推公式
思考:如何得到dp[i],到达这一层楼梯是从前一层或者前两层过来的
dp[i]=min(dp[i-1]+cost[i-1]+dp[i-2]+dp[i-2])
递推公式的解释——到达[i-1]位置的两种可能:
从i-1的位置到达i,i-1的最小花费dp[i-1]加上向上跳一格到达i位置消耗的体力值
从i-2的位置到达i,i-2的最小花费dp[i-2]加上向上跳两格到达i位置消耗的体力值
第三步:dp数组的初始化
dp[0]=0 dp[1]=0(到达这个位置时不需要花费,跳才需要)
第四步:遍历顺序
从前向后遍历
第五步:打印dp数组(检验bug)
相关代码1:
class Solutin
{
public:
int minCostClimbingStairs(vector<int>&cost)
{
vector<int>dp(cost.size()+1);
dp[0]=0;
dp[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[]);
}
}
时间复杂度:O(n)
空间复杂度:O(n)
相关代码2(优化空间复杂度):
class Solutin
{
public:
int minCostClimbingStairs(vector<int>&cost)
{
int dp[0]=0;
int dp[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]);
dp0=dp1;
dp1=dpi
}
return dp1;
}
时间复杂度:O(n)
空间复杂度:O(1)
补充知识:
vector<int> &cost
cost是一个容器变量,容器的名字叫做vector,容器内存的数据是int类型的
vector<int> cost
cost是一个引用,引用的东西是vector容器的变量,容器内存的数据是int类型的