一、leetcode第509题
本题要求斐波那契数列的通式,通过定义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];}
};
二、leetcode第70题
首先设置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];}
};
三、leetcode第746题
本题要求爬楼梯的最小花费,首先设置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()];}
};