小白算法集训营-大幅提升刷题量,快速逃离新手区(已完结)
获取ZY↑↑方打开链接↑↑
动态规划是一种在数学、管理科学、计算机科学、经济学和生物信息学等领域中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
以下是动态规划的三大特性:
- 最优子结构:一个问题的最优解包含其子问题的最优解。这意味着可以通过组合子问题的最优解来构造原问题的最优解。
- 子问题重叠:在解决一个问题时,相同的子问题会被反复计算多次。动态规划方法通常会将这些子问题的解存储起来(通常是在一个表格中),这样每个子问题只需解决一次,从而减少计算量。
- 无后效性:一旦某个给定子问题的解被确定了,它就不会再改变,不论在这之后会解决哪些子问题。也就是说,子问题的解将不受在这之后解决的子问题的影响。
最优子结构怎么理解?
"最优子结构"是动态规划中的一个核心概念,它描述了一个问题可以分解为若干个子问题,并且这些子问题的最优解能够被组合起来形成原问题的最优解的性质。以下是对"最优子结构"的详细解释:
定义
如果一个问题的最优解包含了其子问题的最优解,那么这个问题就具有最优子结构性质。
理解步骤
- 问题分解:
-
首先,将一个复杂的问题分解成若干个子问题。这些子问题通常与原问题相似,但规模更小。
-
子问题的独立性:
-
子问题应该是相互独立的,或者至少在计算最优解时,子问题的解不应该相互影响。这意味着一个子问题的解一旦确定,就不会因为其他子问题的解的改变而改变。
-
最优解的组合:
-
原问题的最优解可以通过某种方式,将子问题的最优解组合起来得到。这种组合方式可能是简单的选择,也可能是更复杂的合并操作。
-
无后效性:
-
最优子结构往往与"无后效性"相联系,即一旦某个子问题的最优解确定后,其结果不会受到后续决策的影响。
举例说明
以经典的背包问题为例:
- 问题定义:给定一组物品,每个物品有一定的价值和重量,背包有一定的承重能力,如何选择物品使得背包中的物品总价值最大?
- 最优子结构:
-
- 假设我们要求解包含前
i个物品,背包容量为W时的最大价值,记为dp[i][W]。 - 如果我们确定了第
i个物品放入背包中,那么问题就转化为"求解前i-1个物品放入容量为W - weight[i]的背包中的最大价值",即dp[i-1][W - weight[i]]。 - 如果第
i个物品不放入背包,那么问题就转化为"求解前i-1个物品放入容量为W的背包中的最大价值",即dp[i-1][W]。 - 因此,
dp[i][W]的值应该是上述两种情况的最大值,这就是最优子结构的体现。
- 假设我们要求解包含前
动态规划的五大类型通常指的是在应用动态规划时,可以根据问题特性所采取的五种不同方法:
- 线性动规:这类问题中,状态转移方程呈线性关系,如01背包问题。
- 区域动规:在这类问题中,需要考虑的状态集合是二维的,如矩阵连乘问题。
- 树形动规:状态转移方程以树状结构进行,这类问题一般涉及到树或图,如二叉树中的最大路径和问题。
- 背包动规:这类问题基于背包问题的模型,可以进一步细分为0-1背包、完全背包、多重背包、分组背包等。
- 状态压缩动规:当状态可以用少量的变量表示时,可以通过位运算等方法来压缩状态,从而优化时间和空间复杂度,如N皇后问题。
动态规划的关键在于找到正确的状态表示(dp数组)以及状态转移方程。正确识别和应用这些特性和类型,将有助于高效地解决动态规划问题。