本题要求斐波那契数列的通式,通过定义dp数组,确定dp[i]=dp[i-1]+dp[i-2]的递推式,从而确定dp数组的含义为第i个数的大小。
具体代码如下:
class Solution {
public:
int fib(int n) {
if(n==0)
{
return 0;
}
if(n==1)
{
return 1;
}
vector<int>dp(n+1);
dp[0]=0;
dp[1]=1;
for(int i=2;i<=n;i++)
{
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
};
首先设置dp数组为爬到第i个台阶的方法数,因为每次只能爬一阶或两阶,可得递推式dp[i]=dp[i-1]+dp[i-2],同时要使i大于0需要提前定义dp[0]和dp[1]。
具体代码如下:
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];
}
};
本题要求爬楼梯的最小花费,首先设置dp数组为第i个台阶上的花费,与上题类似递推式为dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]),也需要提前设置dp[0]和dp[1]。
具体代码如下:
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int>dp(cost.size()+1);
dp[2]=min(cost[0],cost[1]);
dp[1]=dp[0]=0;
for(int i=3;i<=cost.size();i++)
{
dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return dp[cost.size()];
}
};
1325

被折叠的 条评论
为什么被折叠?



