dp四步
1,明确dp数组及下标含义
2.确定递推公式
3..据题意初始化dp数组
4.确定求dp数组的遍历顺序
几道简单的dp题
1.dp[i]含义:第i项斐波那契数列
2.递推公式:dp[i]=dp[i-1]+dp[i-2]
3.初始化:dp[1]=1,dp[2]=1
4.遍历顺序:后面的项依赖于前面的项,故从前向后遍历
class Solution {
public:
int fib(int n) {
int dp[35];
dp[1]=1;dp[2]=1;
for(int i=3;i<=n;i++)
{
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
};
1.dp[i]含义:爬上第i阶楼梯的方法数
2.递推公式:dp[i]=dp[i-1]+dp[i-2]
3.初始化:dp[1]=1,dp[2]=2
4.遍历顺序:后面的项依赖于前面的项,故从前向后遍历
class Solution {
public:
int climbStairs(int n) {
int dp[50];
dp[1]=1;dp[2]=2;
for(int i=3;i<=n;i++)
dp[i]=dp[i-1]+dp[i-2];
return dp[n];
}
};
1.dp[i]含义:爬上第i阶楼梯的最小花费
2.递推公式:dp[i]=min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1]);
3.初始化:dp[0]=0,dp[1]=0
4.遍历顺序:后面的项依赖于前面的项,故从前向后遍历
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n=cost.size();
int dp[1005];
dp[0]=0;dp[1]=0;
for(int i=2;i<=n;i++)
{
dp[i]=min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1]);
}
return dp[n];
}
};