mirror of
https://github.com/krahets/hello-algo.git
synced 2026-04-13 18:00:18 +08:00
First version.
This commit is contained in:
88
ru/docs/chapter_dynamic_programming/dp_problem_features.md
Normal file
88
ru/docs/chapter_dynamic_programming/dp_problem_features.md
Normal file
@@ -0,0 +1,88 @@
|
||||
# Особенности задач динамического программирования
|
||||
|
||||
В предыдущем разделе мы изучили, как динамическое программирование решает исходную задачу путем разложения на подзадачи. На самом деле разложение на подзадачи -- это универсальный алгоритмический подход, который по-разному применяется в методах «разделяй и властвуй», динамическом программировании и поиске с возвратом.
|
||||
|
||||
- Алгоритм «разделяй и властвуй» рекурсивно делит исходную задачу на несколько независимых подзадач до самых минимальных и в процессе обратного хода объединяет решения всех подзадач.
|
||||
- Динамическое программирование также осуществляет рекурсивное разбиение задачи. Основное отличие от алгоритмов «разделяй и властвуй» заключается в том, что подзадачи в динамическом программировании взаимозависимы, и в процессе разбиения возникает множество перекрывающихся подзадач.
|
||||
- Алгоритмы поиска с возвратом исчерпывают все возможные решения методом проб и возвратов, осекая ненужные ветви поиска с помощью обрезки. Решение исходной задачи состоит из серии шагов принятия решений, каждый шаг можно рассматривать как подзадачу.
|
||||
|
||||
На практике динамическое программирование часто используется для решения задач оптимизации, которые не только содержат перекрывающиеся подзадачи, но и обладают двумя другими важными свойствами: оптимальной подструктурой и отсутствием последействия.
|
||||
|
||||
## Оптимальная подструктура
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:我们对爬楼梯问题稍作改动,使之更加适合展示最优子结构概念... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:!!! question "爬楼梯最小代价"... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:如下图所示,若第 $1$、$2$、$3$ 阶的代价分别为 $1$、$10$、$1$ ,则从地面爬到第 $3$ 阶的最小代价为 $2$... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:设 $dp[i]$ 为爬到第 $i$ 阶累计付出的代价... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:这便可以引出最优子结构的含义... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:本题显然具有最优子结构... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:那么,上一节的爬楼梯题目有没有最优子结构呢... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:根据状态转移方程,以及初始状态... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:下图展示了以上代码的动态规划过程... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:本题也可以进行空间优化... -->
|
||||
|
||||
## Отсутствие последействия
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:无后效性是动态规划能够有效解决问题的重要特性之一... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:以爬楼梯问题为例,给定状态 $i$... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:然而,如果我们给爬楼梯问题添加一个约束... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:!!! question "带约束爬楼梯"... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:如下图所示,爬上第 $3$ 阶仅剩 $2$ 种可行方案... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:在该问题中,如果上一轮是跳 $1$ 阶上来的... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:不难发现,此问题已不满足无后效性... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:为此,我们需要扩展状态定义... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:- 当上一轮跳了 $1$ 阶时... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:如下图所示,在该定义下... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:最终,返回 $dp[n, 1] + dp[n, 2]$ 即可... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:在上面的案例中,由于仅需多考虑前面一个状态... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:!!! question "爬楼梯与障碍生成"... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:在这个问题中,下次跳跃依赖过去所有的状态... -->
|
||||
|
||||
<!-- 🔴 俄文版缺失此段落 -->
|
||||
<!-- 中文原文:实际上,许多复杂的组合优化问题(例如旅行商问题)不满足无后效性... -->
|
||||
Reference in New Issue
Block a user