动态规划总结与示例

什么是动态规划:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。
意思很简单,就是不要想一下子找到结果,要你求第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
这道题证明,最优规划没说一定要建数组

如果有遇到有意思的最优规划的题目,可以分享给我。大家一起解决。

发布了127 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_33321609/article/details/103991824
今日推荐