题目: 一次可以爬 1
或 2
个台阶,请问有多少种方法到达第 n
个台阶.
思路: 动态规划.
i
个台阶的方法数.代码:
int climbStairs(int n) {
vector<int> dp(n + 1, 0);
dp[0] = 1, dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
题目: 求斐波那契数列的第 n
个数,其满足 f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n)=f(n-1)+f(n-2) f(n)=f(n−1)+f(n−2), 且 f ( 0 ) = 0 , f ( 1 ) = 1 f(0)=0,f(1)=1 f(0)=0,f(1)=1.
思路: 动态规划.
i
斐波那契数个.代码:
int fib(int n) {
if (n <= 1) return n;
vector<int> dp(n + 1, 0);
dp[0] = 0, dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
题目: 求泰波那契数列的第 n
个数,其满足 f ( n ) = f ( n − 1 ) + f ( n − 2 ) + f ( n − 3 ) f(n)=f(n-1)+f(n-2)+f(n-3) f(n)=f(n−1)+f(n−2)+f(n−3), 且 f ( 0 ) = 0 , f ( 1 ) = 1 , f ( 2 ) = 1 f(0)=0,f(1)=1,f(2)=1 f(0)=0,f(1)=1,f(2)=1.
思路: 动态规划.
i
个泰波那契数.代码:
int tribonacci(int n) {
if (n == 0) return 0;
if (n <= 2) return 1;
vector<int> dp(i + 1, 0);
dp[0] = 0, dp[1] = 1, dp[2] =1;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
}
return dp[n];
}
题目: 一次可以爬 1
或 2
个台阶, cost[i]
为从第 i
个台阶往上爬的费用, 爬到楼顶的最低花费为多少.
思路: 动态规划.
i
个台阶所花费的总费用.代码:
int minCostClimbingStairs(vector<int>& cost) {
int len = cost.size();
vector<int> dp(len, 0);
dp[0] = cost[0], dp[1] = cost[1];
for (int i = 2; i < n; i++) {
dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
}
return min(dp[i - 1], dp[i - 2]);
}
题目: 小偷对一排屋子进行偷窃,只能偷不相邻的房子,请问最高可以偷多少钱.
思路: 动态规划.
i
个房子的最大金额.代码:
int rob(vector<int>& nums) {
int len = nums.size();
vector<int> dp(len + 1, 0);
dp[0] = 0, dp[1] = nums[0];
for (int i = 2; i <= len; i++) {
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1]);
}
return dp[len];
}