LeetCode 509 斐波那契数
题目链接:509
思路:
- 首先定义数组
dp[i]
,代表第i
个斐波那契数。 - 根据斐波那契数列性质,得递推公式
dp[i]=dp[i-1]+dp[i-2]
。 - 由题得初始条件
dp[0]=0, dp[1]=1
。 - 由于后面的数依赖前两个数,因此遍历顺序从前往后。
代码:
class Solution {
public:
int fib(int n) {
vector<int> dp(n+1);
if (n <= 1) return n;
dp[0] = 0;
dp[1] = 1;
for (int i=2; i<=n; ++i) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
};
代码:空间优化,只保存两个数
class Solution {
public:
int fib(int n) {
vector<int> dp(2);
if (n <= 1) return n;
dp[0] = 0;
dp[1] = 1;
for (int i=2; i<=n; ++i) {
int sum = dp[0] + dp[1];
dp[0] = dp[1];
dp[1] = sum;
}
return dp[1];
}
};
LeetCode 70 爬楼梯
题目链接:70
思路:
- 首先定义数组
dp[i]
,代表爬到第i
阶有几种方法。 - 爬到第
i
阶,有两种情况,从i-1
阶爬1步或从i-2
阶爬2步。到i-1
阶有dp[i-1]
种方法,到i-2
阶有dp[i-2]
种方法,前两种情况互不重复,因此得递推公式dp[i]=dp[i-1]+dp[i-2]
。 - 由于爬到第0阶没有讨论意义,因此初始条件直接从
1
开始考虑,dp[1]=1,dp[2]=2
。 - 遍历顺序从前往后。
代码:
class Solution {
public:
int climbStairs(int n) {
if (n <= 1) 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];
}
return dp[n];
}
};
746 使用最小花费爬楼梯
题目链接:746
思路:
- 首先定义数组
dp[i]
,代表爬到第i
阶的最小步数。 - 爬到第
i
阶,有两种情况,从i-1
阶爬1步或从i-2
阶爬2步。到i-1
阶的最小花费为cost[i-1]
,到i-2
阶的最小花费为cost[i-2]
,则爬到第i
阶的最小花费为(递推公式)dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]
。 - 可以从第0阶或第1阶开始爬,因此
dp[0]=0,dp[1]=0
。 - 遍历顺序从前往后。
代码:
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
if (cost.size() <= 1) return 0;
vector<int> dp(cost.size()+1);
dp[0] = 0;
dp[1] = 0;
for (int i=2; i<dp.size(); ++i) {
dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);
}
return dp.back();
}
};