This commit is contained in:
krahets
2023-07-16 04:19:01 +08:00
parent 54b99d13c8
commit dbf682ebc9
110 changed files with 25308 additions and 10305 deletions

View File

@ -25,7 +25,7 @@
<title>13.2.   DP 问题特性New - Hello 算法</title>
<title>14.2.   DP 问题特性New - Hello 算法</title>
@ -79,7 +79,7 @@
<div data-md-component="skip">
<a href="#132" class="md-skip">
<a href="#142" class="md-skip">
跳转至
</a>
@ -113,7 +113,7 @@
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
13.2. &nbsp; DP 问题特性New
14.2. &nbsp; DP 问题特性New
</span>
</div>
@ -1771,6 +1771,87 @@
<div class="md-nav__link md-nav__link--index ">
<a href="../../chapter_divide_and_conquer/">12. &nbsp; &nbsp; 分治</a>
<label for="__nav_13">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_13">
<span class="md-nav__icon md-icon"></span>
12. &nbsp; &nbsp; 分治
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter_divide_and_conquer/divide_and_conquer/" class="md-nav__link">
12.1. &nbsp; 分治算法New
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_divide_and_conquer/build_binary_tree/" class="md-nav__link">
12.2. &nbsp; 构建树问题New
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_14" >
@ -1782,18 +1863,18 @@
<div class="md-nav__link md-nav__link--index ">
<a href="../../chapter_backtracking/">12. &nbsp; &nbsp; 回溯</a>
<a href="../../chapter_backtracking/">13. &nbsp; &nbsp; 回溯</a>
<label for="__nav_13">
<label for="__nav_14">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_13">
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_14_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_14">
<span class="md-nav__icon md-icon"></span>
12. &nbsp; &nbsp; 回溯
13. &nbsp; &nbsp; 回溯
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -1806,7 +1887,7 @@
<li class="md-nav__item">
<a href="../../chapter_backtracking/backtracking_algorithm/" class="md-nav__link">
12.1. &nbsp; 回溯算法
13.1. &nbsp; 回溯算法
</a>
</li>
@ -1820,7 +1901,7 @@
<li class="md-nav__item">
<a href="../../chapter_backtracking/permutations_problem/" class="md-nav__link">
12.2. &nbsp; 全排列问题
13.2. &nbsp; 全排列问题
</a>
</li>
@ -1834,7 +1915,7 @@
<li class="md-nav__item">
<a href="../../chapter_backtracking/subset_sum_problem/" class="md-nav__link">
12.3. &nbsp; 子集和问题
13.3. &nbsp; 子集和问题
</a>
</li>
@ -1848,7 +1929,7 @@
<li class="md-nav__item">
<a href="../../chapter_backtracking/n_queens_problem/" class="md-nav__link">
12.4. &nbsp; N 皇后问题
13.4. &nbsp; N 皇后问题
</a>
</li>
@ -1862,7 +1943,7 @@
<li class="md-nav__item">
<a href="../../chapter_backtracking/summary/" class="md-nav__link">
12.5. &nbsp; 小结
13.5. &nbsp; 小结
</a>
</li>
@ -1890,7 +1971,7 @@
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_14" checked>
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_15" checked>
@ -1917,18 +1998,18 @@
<div class="md-nav__link md-nav__link--index ">
<a href="../">13. &nbsp; &nbsp; 动态规划</a>
<a href="../">14. &nbsp; &nbsp; 动态规划</a>
<label for="__nav_14">
<label for="__nav_15">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_14_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_14">
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_15_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_15">
<span class="md-nav__icon md-icon"></span>
13. &nbsp; &nbsp; 动态规划
14. &nbsp; &nbsp; 动态规划
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -1941,7 +2022,7 @@
<li class="md-nav__item">
<a href="../intro_to_dynamic_programming/" class="md-nav__link">
13.1. &nbsp; 初探动态规划New
14.1. &nbsp; 初探动态规划New
</a>
</li>
@ -1964,12 +2045,12 @@
<label class="md-nav__link md-nav__link--active" for="__toc">
13.2. &nbsp; DP 问题特性New
14.2. &nbsp; DP 问题特性New
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
13.2. &nbsp; DP 问题特性New
14.2. &nbsp; DP 问题特性New
</a>
@ -1988,15 +2069,15 @@
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#1321" class="md-nav__link">
13.2.1. &nbsp; 最优子结构
<a href="#1421" class="md-nav__link">
14.2.1. &nbsp; 最优子结构
</a>
</li>
<li class="md-nav__item">
<a href="#1322" class="md-nav__link">
13.2.2. &nbsp; 无后效性
<a href="#1422" class="md-nav__link">
14.2.2. &nbsp; 无后效性
</a>
</li>
@ -2017,7 +2098,7 @@
<li class="md-nav__item">
<a href="../dp_solution_pipeline/" class="md-nav__link">
13.3. &nbsp; DP 解题思路New
14.3. &nbsp; DP 解题思路New
</a>
</li>
@ -2031,7 +2112,7 @@
<li class="md-nav__item">
<a href="../knapsack_problem/" class="md-nav__link">
13.4. &nbsp; 0-1 背包问题New
14.4. &nbsp; 0-1 背包问题New
</a>
</li>
@ -2045,7 +2126,7 @@
<li class="md-nav__item">
<a href="../unbounded_knapsack_problem/" class="md-nav__link">
13.5. &nbsp; 完全背包问题New
14.5. &nbsp; 完全背包问题New
</a>
</li>
@ -2059,7 +2140,7 @@
<li class="md-nav__item">
<a href="../edit_distance_problem/" class="md-nav__link">
13.6. &nbsp; 编辑距离问题New
14.6. &nbsp; 编辑距离问题New
</a>
</li>
@ -2073,76 +2154,7 @@
<li class="md-nav__item">
<a href="../summary/" class="md-nav__link">
13.7. &nbsp; 小结New
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_15" >
<label class="md-nav__link" for="__nav_15" id="__nav_15_label" tabindex="0">
14. &nbsp; &nbsp; 附录
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_15_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15">
<span class="md-nav__icon md-icon"></span>
14. &nbsp; &nbsp; 附录
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter_appendix/installation/" class="md-nav__link">
14.1. &nbsp; 编程环境安装
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_appendix/contribution/" class="md-nav__link">
14.2. &nbsp; 一起参与创作
14.7. &nbsp; 小结New
</a>
</li>
@ -2173,6 +2185,75 @@
<label class="md-nav__link" for="__nav_16" id="__nav_16_label" tabindex="0">
15. &nbsp; &nbsp; 附录
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_16_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_16">
<span class="md-nav__icon md-icon"></span>
15. &nbsp; &nbsp; 附录
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter_appendix/installation/" class="md-nav__link">
15.1. &nbsp; 编程环境安装
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_appendix/contribution/" class="md-nav__link">
15.2. &nbsp; 一起参与创作
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_17" >
@ -2185,8 +2266,8 @@
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_16_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_16">
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_17_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_17">
<span class="md-nav__icon md-icon"></span>
参考文献
</label>
@ -2227,15 +2308,15 @@
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#1321" class="md-nav__link">
13.2.1. &nbsp; 最优子结构
<a href="#1421" class="md-nav__link">
14.2.1. &nbsp; 最优子结构
</a>
</li>
<li class="md-nav__item">
<a href="#1322" class="md-nav__link">
13.2.2. &nbsp; 无后效性
<a href="#1422" class="md-nav__link">
14.2.2. &nbsp; 无后效性
</a>
</li>
@ -2263,10 +2344,10 @@
<h1 id="132">13.2. &nbsp; 动态规划问题特性<a class="headerlink" href="#132" title="Permanent link">&para;</a></h1>
<h1 id="142">14.2. &nbsp; 动态规划问题特性<a class="headerlink" href="#142" title="Permanent link">&para;</a></h1>
<p>在上节中,我们学习了动态规划问题的暴力解法,从递归树中观察到海量的重叠子问题,以及了解到动态规划是如何通过记录解来优化时间复杂度的。</p>
<p>实际上,动态规划最常用来求解最优方案问题,例如寻找最短路径、最大利润、最少时间等。<strong>这类问题不仅包含重叠子问题,往往还具有另外两大特性:最优子结构、无后效性</strong></p>
<h2 id="1321">13.2.1. &nbsp; 最优子结构<a class="headerlink" href="#1321" title="Permanent link">&para;</a></h2>
<h2 id="1421">14.2.1. &nbsp; 最优子结构<a class="headerlink" href="#1421" title="Permanent link">&para;</a></h2>
<p>我们对爬楼梯问题稍作改动,使之更加适合展示最优子结构概念。</p>
<div class="admonition question">
<p class="admonition-title">爬楼梯最小代价</p>
@ -2484,7 +2565,7 @@ dp[i] = \min(dp[i-1], dp[i-2]) + cost[i]
</div>
</div>
</div>
<h2 id="1322">13.2.2. &nbsp; 无后效性<a class="headerlink" href="#1322" title="Permanent link">&para;</a></h2>
<h2 id="1422">14.2.2. &nbsp; 无后效性<a class="headerlink" href="#1422" title="Permanent link">&para;</a></h2>
<p>「无后效性」是动态规划能够有效解决问题的重要特性之一,定义为:<strong>给定一个确定的状态,它的未来发展只与当前状态有关,而与当前状态过去所经历过的所有状态无关</strong></p>
<p>以爬楼梯问题为例,给定状态 <span class="arithmatex">\(i\)</span> ,它会发展出状态 <span class="arithmatex">\(i+1\)</span> 和状态 <span class="arithmatex">\(i+2\)</span> ,分别对应跳 <span class="arithmatex">\(1\)</span> 步和跳 <span class="arithmatex">\(2\)</span> 步。在做出这两种选择时,我们无需考虑状态 <span class="arithmatex">\(i\)</span> 之前的状态,即它们对状态 <span class="arithmatex">\(i\)</span> 的未来没有影响。</p>
<p>然而,如果我们向爬楼梯问题添加一个约束,情况就不一样了。</p>
@ -2713,7 +2794,7 @@ dp[i, 2] = dp[i-2, 1] + dp[i-2, 2]
<nav class="md-footer__inner md-grid" aria-label="页脚" >
<a href="../intro_to_dynamic_programming/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 13.1. &amp;nbsp; 初探动态规划New" rel="prev">
<a href="../intro_to_dynamic_programming/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 14.1. &amp;nbsp; 初探动态规划New" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
@ -2722,20 +2803,20 @@ dp[i, 2] = dp[i-2, 1] + dp[i-2, 2]
上一页
</span>
<div class="md-ellipsis">
13.1. &nbsp; 初探动态规划New
14.1. &nbsp; 初探动态规划New
</div>
</div>
</a>
<a href="../dp_solution_pipeline/" class="md-footer__link md-footer__link--next" aria-label="下一页: 13.3. &amp;nbsp; DP 解题思路New" rel="next">
<a href="../dp_solution_pipeline/" class="md-footer__link md-footer__link--next" aria-label="下一页: 14.3. &amp;nbsp; DP 解题思路New" rel="next">
<div class="md-footer__title">
<span class="md-footer__direction">
下一页
</span>
<div class="md-ellipsis">
13.3. &nbsp; DP 解题思路New
14.3. &nbsp; DP 解题思路New
</div>
</div>
<div class="md-footer__button md-icon">