First version.

This commit is contained in:
krahets
2026-01-20 15:08:42 +08:00
parent 2213a59ff6
commit 8071daddaa
106 changed files with 11790 additions and 0 deletions

View 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 "爬楼梯与障碍生成"... -->
<!-- 🔴 俄文版缺失此段落 -->
<!-- 中文原文:在这个问题中,下次跳跃依赖过去所有的状态... -->
<!-- 🔴 俄文版缺失此段落 -->
<!-- 中文原文:实际上,许多复杂的组合优化问题(例如旅行商问题)不满足无后效性... -->