509.斐波那契数列
这道题很基础,因为做过挺多遍了,这次看卡哥的视频思路更清晰了,原本我会习惯于开一个很大的数组,但是没必要,只需要实时更新dp[i-1]和dp[i-2]就行。
https://leetcode.cn/problems/fibonacci-number/
class Solution {
public:
int fib(int n) {
if(n<=1)
return n;
int dp[2];
dp[0]=0;
dp[1]=1;
int sum;
for(int i=2;i<=n;i++)
{
sum=dp[0]+dp[1];
dp[0]=dp[1];
dp[1]=sum;
}
return dp[1];
}
};
70.爬楼梯
这道题在大一的时候老师就有讲过,当时还很惊讶于怎么就和斐波那契数列扯上关系,现在可以更好地理解了,Carl哥为了方便我们理解,开了一个dp[3]的数组,但其实没必要,因为这个数组只是记录dp[i-1]和dp[i-2]只是为了方便计算而已,所以我用dp[2]写了代码。
https://leetcode.cn/problems/climbing-stairs/
class Solution {
public:
int climbStairs(int n) {
int dp[2];
dp[0]=1;
dp[1]=2;
int sum;
if(n<=2)
{
return dp[n-1];
}
for(int i=3;i<=n;i++)
{
sum=dp[0]+dp[1];
dp[0]=dp[1];
dp[1]=sum;
}
return dp[1];
}
};
746.使用最小花费爬楼梯
这道题我乍一看知道跟爬楼梯很像,但我又不知它怎么和爬楼梯结合起来,这里还有消耗值呀,但是卡哥一说dp[i]表示到某一个阶梯的消耗值我就get到了,其实就只是dp[i]的含义不一样而已,其他的都一样。
https://leetcode.cn/problems/min-cost-climbing-stairs/
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int dp_0=0;
int dp_1=0;
int sum;
for(int i=2;i<=cost.size();i++)
{
sum=dp_0+cost[i-2]<dp_1+cost[i-1]?dp_0+cost[i-2]:dp_1+cost[i-1];
dp_0=dp_1;
dp_1=sum;
}
return dp_1;
}
};