动态规划中每一个状态一定是由上一个状态推导出来的
动态规划的解题步骤:
1.确定dp数组的下标和具体含义
2.确定递推公式
3.递推数组dp的初始化
4.确定遍历顺序
5.举例推导递推数组
三个关键点:初始化,递推公式,遍历顺序
class Solution {
public:
int fib(int n) {
if(n==0)
{
return 0;
}
if(n==1)
{
return 1;
}
vector<int> res(n+1);
res[0]=0;
res[1]=1;
for(int i=2;i<=n;i++)
{
res[i]=res[i-1]+res[i-2];
}
return res[n];
}
};
class Solution {
public:
int climbStairs(int n) {
vector<int> dp(n+1);
if(n<=2) return n;
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-1】方法相同,还有两层时与dp【i-2】次数相同
数组初始化dp【1】=1;dp【2】=2
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n=cost.size();
vector<int> dp(n+1);
dp[0]=0;
dp[1]=0;
for(int i=2;i<=n;i++)
{
dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return dp[n];
}
};
对于动态规划的题目可以先想一下最后一步是如何计算的然后再往前推导就可以了