509. 斐波那契数
递推关系已经给出来了,即f(n) = f(n-1) + f(n-2);初始化dp也已经给出,即dp[0] = 0,dp[1] = 1,注意第n个位置需要定义dp[n+1]大小的数组。最终结果就是dp[n]。
cpp
class Solution {
public:
int fib(int n) {
if (n == 0 || n == 1) {
return n;
}
vector<int> dp(n+1);
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i<=n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
};
70. 爬楼梯
比斐波那契难一点,但是也有迹可循。一次只能爬两蹬或者一蹬,那么本台阶可由上一阶爬来,也可由上上阶爬来,因此其和即为本蹬数量。而本蹬数量取决于上两凳,因此形成递推关系。dp大小也为n+1。
cpp
class Solution {
public:
int climbStairs(int n) {
if (n <= 2) return n;
vector<int> dp(n+1);
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
for (int i = 0; i<=n ;i++){
cout<<dp[i]<<endl;
}
return dp[n];
}
};
57. 爬楼梯(第八期模拟笔试)
卡码网中的题目。如果题目改为一次可爬1------n怎么解,其实本阶梯可由前n级阶梯到达(如果有的话)。那么就可以两层循环解决。
cpp
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n,m;
cin>>n>>m;
std::vector<int> dp(n+1,0);
dp[0] = 1;
for (int i = 1; i<=n; i++) {
for (int j = 1; j<=m; j++) {
// 向前找m个位置,各个位置都可以到达i,因此累加前面的结果
if (i-j >= 0) dp[i] += dp[i-j];
}
}
cout<<dp[n];
}
746. 使用最小花费爬楼梯
这题出发点可以是0也可以是1,因此从零出发和从1出发都不需要消耗体力。dp数组可以初始化为0。而本台阶可以由上一个台阶爬到,消耗体力x,也可以由上上个台阶爬到,消耗体力y;则达到本台阶消耗的最小体力为min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])。注意最后需要爬到房顶,因此dp大小n+1。
cpp
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int> dp(cost.size()+1);
// 可以从0 也可以从1出发,那么初始化0 和 1位置为0消耗
dp[0] = 0;
dp[1] = 0;
// 需要爬到楼顶, 因此i的值需要最终等于cost的大小
for (int i = 2; i <= cost.size(); i++) {
dp[i] = min(dp[i-2] + cost[i-2], dp[i-1] + cost[i-1]);
}
// 返回dp数组的最后一个值即为结果
return dp[cost.size()];
}
};