什么是动态规划:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。
意思很简单,就是不要想一下子找到结果,要你求第n位,你不要想立马求到,从第0位开始,依次求到。
举个我认为最简单的最优规划的例子,斐波那契数列。
0、1、1、2、3、5、8…
斐波那契数列满足f(x)=f(x-1)+f(x-2)(x>=2);
如果这时候要问你第n列的斐波那契数是多少,怎么计算,先算n-1和n-2列?这样当然也可以,递归而已嘛,如果加上缓存也是可以解的,但是如果用上最优规划,就会很简单
public int fib(int N) {
if(N<=1){
return N;
}
int[] ans = new int[N+1];
ans[1] = 1;
for(int i = 2;i<=N;i++){
ans[i]=ans[i-1]+ans[i-2];
}
return ans[N];
}
这道题就是leetcode第509题,简单题。
最优规划也不一定都是使用一维数组,也可以使用二维数组,找到一个我觉得简单的案例。
leetcode174. 地下城游戏
在这个案例里面,每个阶段的最优解需要从左和上两个位置一起求解。
我发现最优规划的题做得不少,博客没写多少。
leetcode1043. 分隔数组以得到最大和
leetcode552. 学生出勤记录 II
这道题证明,最优规划没说一定要建数组
如果有遇到有意思的最优规划的题目,可以分享给我。大家一起解决。