第一个问题,是一个dp问题,即第n级台阶,可以且仅可以由第n-1或者第n-2级台阶到达。则可以写出状态转移方程:
实际上,规律类似于婓波那契数列,如果补充一个dp[0] = 1的话,为一个标准的奜波那契数列;可以使用递归做法;dp相当于是递归的改进版本,即存储了中间结果,避免了重复的运算。
class Solution {
public:
int jumpFloor(int number) {
int dp[number+1];
memset(dp, 0, sizeof(int)*(number+1));
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= number; ++i) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[number];
}
};
class Solution {
public:
int jumpFloor(int number) {
if (number == 1)
return 1;
else if (number == 2)
return 2;
else
return jumpFloor(number-1) + jumpFloor(number-2);
}
};
复现跳的过程,找数学规律
class Solution {
public:
int jumpFloorII(int number) {
int dp[number+1];
memset(dp, 0, sizeof(number+1));
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= number; ++i) {
dp[i] = 2 * dp[i-1];
}
return dp[number];
}
};