接着斐波那契&爬楼梯的一道动态规划题。
解题
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost)
{
int n = cost.size();
vector<int> mintotal(n+1);
mintotal[0] = cost[0];
mintotal[1] = cost[1];
cost.push_back(0);
if(n >= 2)
{
for(int i = 2; i <= n; ++i)
{
mintotal[i] = min(mintotal[i-1], mintotal[i-2]) + cost[i];
}
}
return mintotal[n];
}
};
本题思路与踩坑
- 复习一下vector的插入操作:
a.push_back(i); //最简单的插入,直接向vector末尾加入一个数据
a.insert(pos,elem); //向pos迭代器指向的对象前插入一个对象,注意是对象前
a.insert(pos, n, elem); //向pos迭代器指向的对象前插入n个相同对象
a.insert(pos, begin, end); //向pos迭代器指向的对象前插入[begin,end)之间的对象
后三个函数都会返回新数据的位置
刚开始写的时候cost[n]未初始化,导致有部分测试用例没通过。
- 关于n=2的时候。一开始 if(n >= 2)的等号没带上。
- 本题要注意n/n+1/size之类的下标问题
- 在写的过程中,老是出现一些其他的想法,比如认为到底是哪一步花费体力,是爬上⼀个台阶就要花费对应的体力值,还是过了之后再把刚刚那阶付掉。其实是两种思路,都可以,比如另一种写法(过了在以后再付)是这样的:
classSolution{
public:
intminCostClimbingStairs(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()];
}
};