This commit is contained in:
krahets
2023-09-22 13:08:10 +08:00
parent 5bb9f76fbc
commit 6fffa33695
107 changed files with 2561 additions and 19178 deletions

View File

@ -60,7 +60,18 @@
</head>
<link href="../../assets/stylesheets/glightbox.min.css" rel="stylesheet"/><style>
html.glightbox-open { overflow: initial; height: 100%; }
.gslide-title { margin-top: 0px; user-select: text; }
.gslide-desc { color: #666; user-select: text; }
.gslide-image img { background: white; }
.gscrollbar-fixer { padding-right: 15px; }
.gdesc-inner { font-size: 0.75rem; }
body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color);}
body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color);}
body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color);}
</style> <script src="../../assets/javascripts/glightbox.min.js"></script></head>
@ -1875,14 +1886,6 @@
10.2 &nbsp; 二分查找插入点
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -1903,14 +1906,6 @@
10.3 &nbsp; 二分查找边界
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2330,14 +2325,6 @@
第 12 章 &nbsp; 分治
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@ -2369,14 +2356,6 @@
12.1 &nbsp; 分治算法
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2397,14 +2376,6 @@
12.2 &nbsp; 分治搜索策略
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2425,14 +2396,6 @@
12.3 &nbsp; 构建树问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2453,14 +2416,6 @@
12.4 &nbsp; 汉诺塔问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2481,14 +2436,6 @@
12.5 &nbsp; 小结
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2722,14 +2669,6 @@
第 14 章 &nbsp; 动态规划
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@ -2761,14 +2700,6 @@
14.1 &nbsp; 初探动态规划
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2798,14 +2729,6 @@
14.2 &nbsp; DP 问题特性
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
<span class="md-nav__icon md-icon"></span>
</label>
@ -2817,14 +2740,6 @@
14.2 &nbsp; DP 问题特性
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@ -2879,14 +2794,6 @@
14.3 &nbsp; DP 解题思路
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2907,14 +2814,6 @@
14.4 &nbsp; 0-1 背包问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2935,14 +2834,6 @@
14.5 &nbsp; 完全背包问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2963,14 +2854,6 @@
14.6 &nbsp; 编辑距离问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2991,14 +2874,6 @@
14.7 &nbsp; 小结
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -3057,14 +2932,6 @@
第 15 章 &nbsp; 贪心
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@ -3096,14 +2963,6 @@
15.1 &nbsp; 贪心算法
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -3124,14 +2983,6 @@
15.2 &nbsp; 分数背包问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -3152,14 +3003,6 @@
15.3 &nbsp; 最大容量问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -3180,14 +3023,6 @@
15.4 &nbsp; 最大切分乘积问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -3208,14 +3043,6 @@
15.5 &nbsp; 小结
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -3496,7 +3323,7 @@
<p>给定一个楼梯,你每步可以上 <span class="arithmatex">\(1\)</span> 阶或者 <span class="arithmatex">\(2\)</span> 阶,每一阶楼梯上都贴有一个非负整数,表示你在该台阶所需要付出的代价。给定一个非负整数数组 <span class="arithmatex">\(cost\)</span> ,其中 <span class="arithmatex">\(cost[i]\)</span> 表示在第 <span class="arithmatex">\(i\)</span> 个台阶需要付出的代价,<span class="arithmatex">\(cost[0]\)</span> 为地面起始点。请计算最少需要付出多少代价才能到达顶部?</p>
</div>
<p>如图 14-6 所示,若第 <span class="arithmatex">\(1\)</span><span class="arithmatex">\(2\)</span><span class="arithmatex">\(3\)</span> 阶的代价分别为 <span class="arithmatex">\(1\)</span><span class="arithmatex">\(10\)</span><span class="arithmatex">\(1\)</span> ,则从地面爬到第 <span class="arithmatex">\(3\)</span> 阶的最小代价为 <span class="arithmatex">\(2\)</span></p>
<p><img alt="爬到第 3 阶的最小代价" src="../dp_problem_features.assets/min_cost_cs_example.png" /></p>
<p><a class="glightbox" href="../dp_problem_features.assets/min_cost_cs_example.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="爬到第 3 阶的最小代价" src="../dp_problem_features.assets/min_cost_cs_example.png" /></a></p>
<p align="center"> 图 14-6 &nbsp; 爬到第 3 阶的最小代价 </p>
<p><span class="arithmatex">\(dp[i]\)</span> 为爬到第 <span class="arithmatex">\(i\)</span> 阶累计付出的代价,由于第 <span class="arithmatex">\(i\)</span> 阶只可能从 <span class="arithmatex">\(i - 1\)</span> 阶或 <span class="arithmatex">\(i - 2\)</span> 阶走来,因此 <span class="arithmatex">\(dp[i]\)</span> 只可能等于 <span class="arithmatex">\(dp[i - 1] + cost[i]\)</span><span class="arithmatex">\(dp[i - 2] + cost[i]\)</span> 。为了尽可能减少代价,我们应该选择两者中较小的那一个:</p>
@ -3725,7 +3552,7 @@ dp[i] = \min(dp[i-1], dp[i-2]) + cost[i]
</div>
</div>
<p>图 14-7 展示了以上代码的动态规划过程。</p>
<p><img alt="爬楼梯最小代价的动态规划过程" src="../dp_problem_features.assets/min_cost_cs_dp.png" /></p>
<p><a class="glightbox" href="../dp_problem_features.assets/min_cost_cs_dp.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="爬楼梯最小代价的动态规划过程" src="../dp_problem_features.assets/min_cost_cs_dp.png" /></a></p>
<p align="center"> 图 14-7 &nbsp; 爬楼梯最小代价的动态规划过程 </p>
<p>本题也可以进行空间优化,将一维压缩至零维,使得空间复杂度从 <span class="arithmatex">\(O(n)\)</span> 降低至 <span class="arithmatex">\(O(1)\)</span></p>
@ -3925,7 +3752,7 @@ dp[i] = \min(dp[i-1], dp[i-2]) + cost[i]
<p>给定一个共有 <span class="arithmatex">\(n\)</span> 阶的楼梯,你每步可以上 <span class="arithmatex">\(1\)</span> 阶或者 <span class="arithmatex">\(2\)</span> 阶,<strong>但不能连续两轮跳 <span class="arithmatex">\(1\)</span></strong>,请问有多少种方案可以爬到楼顶。</p>
</div>
<p>例如图 14-8 ,爬上第 <span class="arithmatex">\(3\)</span> 阶仅剩 <span class="arithmatex">\(2\)</span> 种可行方案,其中连续三次跳 <span class="arithmatex">\(1\)</span> 阶的方案不满足约束条件,因此被舍弃。</p>
<p><img alt="带约束爬到第 3 阶的方案数量" src="../dp_problem_features.assets/climbing_stairs_constraint_example.png" /></p>
<p><a class="glightbox" href="../dp_problem_features.assets/climbing_stairs_constraint_example.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="带约束爬到第 3 阶的方案数量" src="../dp_problem_features.assets/climbing_stairs_constraint_example.png" /></a></p>
<p align="center"> 图 14-8 &nbsp; 带约束爬到第 3 阶的方案数量 </p>
<p>在该问题中,如果上一轮是跳 <span class="arithmatex">\(1\)</span> 阶上来的,那么下一轮就必须跳 <span class="arithmatex">\(2\)</span> 阶。这意味着,<strong>下一步选择不能由当前状态(当前楼梯阶数)独立决定,还和前一个状态(上轮楼梯阶数)有关</strong></p>
@ -3942,7 +3769,7 @@ dp[i, 1] = dp[i-1, 2] \\
dp[i, 2] = dp[i-2, 1] + dp[i-2, 2]
\end{cases}
\]</div>
<p><img alt="考虑约束下的递推关系" src="../dp_problem_features.assets/climbing_stairs_constraint_state_transfer.png" /></p>
<p><a class="glightbox" href="../dp_problem_features.assets/climbing_stairs_constraint_state_transfer.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="考虑约束下的递推关系" src="../dp_problem_features.assets/climbing_stairs_constraint_state_transfer.png" /></a></p>
<p align="center"> 图 14-9 &nbsp; 考虑约束下的递推关系 </p>
<p>最终,返回 <span class="arithmatex">\(dp[n, 1] + dp[n, 2]\)</span> 即可,两者之和代表爬到第 <span class="arithmatex">\(n\)</span> 阶的方案总数。</p>
@ -4359,10 +4186,15 @@ aria-label="页脚"
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2023 Krahets
Copyright &copy; 2022 - 2023 Krahets
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<!-- Social links -->
@ -4431,5 +4263,5 @@ aria-label="页脚"
</body>
<script>document$.subscribe(() => {const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": false, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "none"});})</script></body>
</html>