算法——db方程 动态规划
动态规划
URL:DP方程及意义_Baiyi_destroyer的博客-CSDN博客_dp方程
1、基本介绍
动态规划使用于分治法使用时多次解决同一子问题造成大量重复的情况,即子问题重叠的情况。
动态规划方法一般用来求解最优化问题。这类问题可以有很多可行解,每个解都有一个值,我们希望找到具有最优值的解,我们称这样的解为问题的一个最优解,而不是最优解,因为可能有多个解都达到最优值。
我们解决动态规划问题一般分为四步:
1、定义一个状态,这是一个最优解的结构特征
2、进行状态递推,得到递推公式
3、进行初始化
4、返回结果
2、案例介绍
1、斐波那契数列
递归方法
1 int feboi(int n){ 2 if(n == 1){ 3 return 1; 4 } 5 if(n == 2){ 6 return 1; 7 } 8 return feboi(n-1)+feboi(n-2); 9 }
动态规划解决:
1、定义一个状态
f(i) 是第i个斐波那契数
2、状态递推
f(i)= f(i-1)+f(i+1);
3、初始化
f(0)=0;
f(1)=1;
f(2)=1;
4、返回结果
f(n);
代码:
int f(n){ vector<int> f{n+1,0}; // 初始化 f[0]=0; if(n==0){return f(0);} f[1]=f[2]=1; if(n==1||n==2){return f[1];} for(int i= 3;i<=n;i++){ f[i]=f[i-1]+f[i-2]; } return f[n]; }
优化,使空间复杂度降为O(1)
代码:
int f(n){ if(n==0){return 0;} if(n==1||n==2){return 1;} int res = 0; int fn1 = 1; int fn2 = 1; for(int i = 3;i<=n;i++){ res = fn1 + fn2; fn1 = fn2; fn2 = res; } return res; }