不懂动态规划?21道 LeetCode题目带你学会动态规划!

您所在的位置:网站首页 动态规划算法例题及解析及答案 不懂动态规划?21道 LeetCode题目带你学会动态规划!

不懂动态规划?21道 LeetCode题目带你学会动态规划!

2023-09-21 19:03| 来源: 网络整理| 查看: 265

“这是我参与8月更文挑战的第17天,活动详情查看: 8月更文挑战”

这篇文章大概是四五月份开始写的,后来忙于毕业就一直忘了写🤣。这几天刚好有时间把这篇文章收收尾,如果觉得有用就点个赞吧!

注: 本文21道动态规划相关的LeetCode题目节选自CodeTop中考察频率较高的动态规划题目,文章较长,全文约15000字,可以收藏一波嗷~~

动态规划.png

1. 动态规划概述 (1)基本概念

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,而我们希望找到具有最优值的解。动态规划算法与分治法类似,基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

动态规划问题经分解得到的子问题往往不是互相独立的。需要保存已解决的子问题的答案,而在需要时再找出已保存的答案,这样就可以避免大量的重复计算。可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。

动态规划有两个重要的概念:

状态:解决某一问题的中间结果,它是子问题的一个抽象定义。 状态转移方程:状态与状态之间的递推关系。

动态规划解题步骤:

状态定义:找出子问题抽象定义。 确定状态转移方程:找出状态与状态之间的递推关系。 初始状态和边界情况:最简单的子问题的结果,也是程序的出口条件 。 返回值:对于简单问题,返回值可能就是最终状态;对于复杂问题可能还需对最终状态做一些额外处理。

下面就通过爬楼梯问题来看看动态规划的具体应用。

题目描述:假设正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?其中 n 是一个正整数。

示例 1:

输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶

示例 2:

输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶

这道题有两个关键特征:

要求给出达成某个目的的解法个数; 不要求给出每一种解法对应的具体路径。

这样的问题往往可以用动态规划进行求解。对于这个问题,每次爬楼梯只有两种情况:

最后一步爬 1 级台阶,前面有 n - 1 级台阶,这种情况下共有f(n - 1)种方法; 最后一步爬 2 级台阶,前面有 n - 2 级台阶,这种情况下共有f(n - 2)种方法;

f(n) 为以上两种情况之和,即 f(n)=f(n-1)+f(n-2),这就是本题用到的递推关系。下面就根据动态规划的四个步骤来看那一下:

状态定义:初始化一个f数组,f[i]表示爬到i级台阶的方法数量; 状态转移方程:f(n)=f(n-1)+f(n-2); 初始状态:一级台阶时,共1种爬法;两级台阶时,可以一级一级爬,也可以一次爬两级,共有2种爬法。即f[1] = 1,f[2] = 2; 返回值:f[n] ,即 n 级台阶共有多少种爬法。

动态规划实现代码如下:

/** * @param {number} n * @return {number} */ const climbStairs = function(n) { // 初始化状态数组 const f = []; // 初始化已知值 f[1] = 1; f[2] = 2; // 动态更新每一层楼梯对应的结果 for(let i = 3;i 向下 -> 向下 2. 向下 -> 向下 -> 向右 3. 向下 -> 向右 -> 向下

示例 3:

输入:m = 7, n = 3 输出:28

示例 4:

输入:m = 3, n = 3 输出:6

提示:

1 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 -> 向右

示例 2:

输入:obstacleGrid = [[0,1],[0,0]] 输出:1

提示:

m == obstacleGrid.length n == obstacleGrid[i].length 1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3