This commit is contained in:
krahets
2023-07-11 19:21:38 +08:00
parent 4c792892a1
commit 2c96e433e2
117 changed files with 4713 additions and 132 deletions

View File

@ -1906,6 +1906,8 @@
@ -2053,6 +2055,20 @@
<li class="md-nav__item">
<a href="../unbounded_knapsack_problem/" class="md-nav__link">
13.5. &nbsp; 完全背包问题New
</a>
</li>
</ul>
</nav>
</li>
@ -2325,12 +2341,12 @@ dp[i, j] = \min(dp[i-1, j], dp[i, j-1]) + grid[i, j]
<p class="admonition-title">Note</p>
<p>边界条件即初始状态,在搜索中用于剪枝,在动态规划中用于初始化 <span class="arithmatex">\(dp\)</span> 表。状态转移顺序的核心是要保证在计算当前问题时,所有它依赖的更小子问题都已经被正确地计算出来。</p>
</div>
<p>最后,我们基于以上结果实现解法即可。熟练度较高同学可以直接写出动态规划解法,初学者可以按照“暴力搜索 <span class="arithmatex">\(\rightarrow\)</span> 记忆化搜索 <span class="arithmatex">\(\rightarrow\)</span> 动态规划” 的顺序实现。</p>
<p>接下来,我们就可以实现动态规划代码了。然而,由于子问题分解是一种从顶至底的思想,因此按照“暴力搜索 <span class="arithmatex">\(\rightarrow\)</span> 记忆化搜索 <span class="arithmatex">\(\rightarrow\)</span> 动态规划”的顺序实现更加符合思维习惯</p>
<h2 id="1333">13.3.3. &nbsp; 方法一:暴力搜索<a class="headerlink" href="#1333" title="Permanent link">&para;</a></h2>
<p>从状态 <span class="arithmatex">\([i, j]\)</span> 开始搜索,不断分解为更小的状态 <span class="arithmatex">\([i-1, j]\)</span><span class="arithmatex">\([i, j-1]\)</span> ,包括以下递归要素:</p>
<ul>
<li><strong>递归参数</strong>:状态 <span class="arithmatex">\([i, j]\)</span> <strong>返回值</strong>:从 <span class="arithmatex">\([0, 0]\)</span><span class="arithmatex">\([i, j]\)</span> 的最小路径和 <span class="arithmatex">\(dp[i, j]\)</span> </li>
<li><strong>终止条件</strong>:当 <span class="arithmatex">\(i = 0\)</span><span class="arithmatex">\(j = 0\)</span> 时,返回代价 <span class="arithmatex">\(grid[0][0]\)</span> </li>
<li><strong>终止条件</strong>:当 <span class="arithmatex">\(i = 0\)</span><span class="arithmatex">\(j = 0\)</span> 时,返回代价 <span class="arithmatex">\(grid[0, 0]\)</span> </li>
<li><strong>剪枝</strong>:当 <span class="arithmatex">\(i &lt; 0\)</span> 时或 <span class="arithmatex">\(j &lt; 0\)</span> 时索引越界,此时返回代价 <span class="arithmatex">\(+\infty\)</span> ,代表不可行;</li>
</ul>
<div class="tabbed-set tabbed-alternate" data-tabs="1:11"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><input id="__tabbed_1_6" name="__tabbed_1" type="radio" /><input id="__tabbed_1_7" name="__tabbed_1" type="radio" /><input id="__tabbed_1_8" name="__tabbed_1" type="radio" /><input id="__tabbed_1_9" name="__tabbed_1" type="radio" /><input id="__tabbed_1_10" name="__tabbed_1" type="radio" /><input id="__tabbed_1_11" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Java</label><label for="__tabbed_1_2">C++</label><label for="__tabbed_1_3">Python</label><label for="__tabbed_1_4">Go</label><label for="__tabbed_1_5">JavaScript</label><label for="__tabbed_1_6">TypeScript</label><label for="__tabbed_1_7">C</label><label for="__tabbed_1_8">C#</label><label for="__tabbed_1_9">Swift</label><label for="__tabbed_1_10">Zig</label><label for="__tabbed_1_11">Dart</label></div>