什么是动态规划
动态规划中的每一个状态都是由上一个状态推导出来的
如果某一问题有很多重叠子问题,使用动态规划最有效
动态规划解题步骤
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组的初始化
- 确定遍历顺序
- 举例推导dp数组
动态规划如何debug
- 这道题目我距离推导状态转移公式了嘛?
- 我打印dp数组的日志了么?
- 打印出来了dp数组和我想的一样么?
练习题
509. 斐波那契数-力扣题目链接
-
确定dp数组以及下标的含义–dp数组保存数列的值-下标表示数列的第几项
-
确定递推公式
- F ( n ) = F ( n − 1 ) + F ( n − 2 ) F(n)=F(n-1)+F(n-2) F(n)=F(n−1)+F(n−2)
-
dp数组的初始化
- F ( 0 ) = 0 F ( 1 ) = 1 F(0)=0 \ F(1)=1 F(0)=0 F(1)=1
-
确定遍历顺序–从前向后遍历
-
举例推导dp数组
-
F(2)=F(2-1)+F(2-2)=0+1=1
-
509-代码
class Solution {
public:
int fib(int n) {
int *dp =new int [n+1];
if(n==0){
return 0;
}else if(n==1){
return 1;
}else{
dp[0]=0;
dp[1]=1;
for(int i=2;i<=n;i++){
dp[i]=dp[i-1]+dp[i-2];
}
}
return dp[n];
}
};