● 509. 斐波那契数
1.dp[i]的定义为:第i个数的斐波那契数值是dp[i]
2.状态转移方程 dp[i] = dp[i - 1] + dp[i - 2]
3.dp[0]=0;dp[1]=1;
4从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的
5.略
class Solution {
public:
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];
}
};
● 70. 爬楼梯
1.dp[i]: 爬到第i层楼梯,有dp[i]种方法
2.dp[i] = dp[i - 1] + dp[i - 2]
3.dp[1] = 1,dp[2] = 2
4.从前向后
5.略
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. 使用最小花费爬楼梯
1.dp表示的是爬到第i个楼梯所需要花费的。
2.dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
3.dp[0]=dp[1]=0;
4.因为i的结果要用到i-1和i-2的结果,所以从前向后遍历。
5.略(要注意在最后结果应该是要爬到n+1的台阶而不是n)
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
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();
}
};