Loading .remarkrc +2 −1 Original line number Diff line number Diff line Loading @@ -3,12 +3,13 @@ "listItemIndent": "tab" }, "plugins": [ "remark-pangu", "remark-copywriting-correct", "remark-preset-lint-markdown-style-guide", ["remark-lint-code-block-style", false], ["remark-lint-maximum-line-length", false], ["remark-lint-ordered-list-marker-value", "ordered"], "remark-math", "remark-math-space", "remark-lint-final-newline", "remark-lint-no-tabs", "remark-clang-format" Loading docs/basic/divide-and-conquer.md +2 −2 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ 介绍分治之前,首先要弄清楚递归这个概念。 递归是什么呢?举个简单的例子:从前有座山,山上有座庙,庙里有个老和尚,老和尚给小和尚讲故事:“从前有座山,山上有座庙,庙里有个老和尚,老和尚给小和尚讲故事:‘从前有座山......’” 这个故事与递归算法有着异曲同工之妙。 递归是什么呢?举个简单的例子:从前有座山,山上有座庙,庙里有个老和尚,老和尚给小和尚讲故事:“从前有座山,山上有座庙,庙里有个老和尚,老和尚给小和尚讲故事:‘从前有座山……’”这个故事与递归算法有着异曲同工之妙。 递归的基本思想是某个函数直接或者间接地调用自身,这样就把原问题的求解转换为许多性质相同但是规模更小的子问题。我们只需要关注如何把原问题划分成符合条件的子问题,而不需要去研究这个子问题是如何被解决的。 Loading docs/basic/expression.md +6 −7 Original line number Diff line number Diff line Loading @@ -6,8 +6,7 @@ ## 递归 递归的方法是把表达式拆分成如图所示的表达式树,然后在树结构上自底向上进行运算。  递归的方法是把表达式拆分成如图所示的表达式树,然后在树结构上自底向上进行运算。 表达式树上进行[树的遍历](/graph/traverse/#dfs_3)可以得到不同类型的表达式 Loading docs/basic/simulate.md +3 −3 Original line number Diff line number Diff line Loading @@ -8,6 +8,6 @@ 1. 在动手写代码之前,在草纸上尽可能的写好要实现的流程 2. 在代码中,尽量把每个部分模块化、写成函数、结构体或类 3. 对于一些可能重复用到的概念,可以统一转化,方便处理 : 如,某题给你 "YY-MM-DD 时: 分" 把它扔到一个函数处理成秒,会减少概念混淆 3. 对于一些可能重复用到的概念,可以统一转化,方便处理:如,某题给你 "YY-MM-DD 时:分" 把它扔到一个函数处理成秒,会减少概念混淆 4. 调试时分块调试,模块化的好处就是可以方便的单独调某一部分 5. 写代码的时候一定要思路清晰,不要想到什么写什么,要按照落在纸上的步骤写。 docs/dp/backpack.md +6 −6 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ 显而易见的是,可以计算总价值的,只有已经放入背包的物体,因此该题中对 "是否为最大值" 的判断是建立在 "已经放入背包之中" 的基础之上的 已知对于一个容量为 v1,可以放置第 1 到第 i 件物体的背包,其最大总价值很明显等于容量为 v1 的背包,放有第 1 到第 (i-1) 件物体时的最大值 (第 i 件物体不取时) 或者是容量为 v1-v[i]的背包,放有第 1 到第 (i-1) 件物体时的最大值 + w[i](第i件物体取时) 已知对于一个容量为 v1,可以放置第 1 到第 i 件物体的背包,其最大总价值很明显等于容量为 v1 的背包,放有第 1 到第 (i-1) 件物体时的最大值(第 i 件物体不取时)或者是容量为 v1-v[i]的背包,放有第 1 到第 (i-1) 件物体时的最大值 + w[i](第i件物体取时) 由此可以得出状态转移方程 Loading @@ -24,13 +24,13 @@ for (int i = 1; i <= v1; i++) for (int l = 0; l <= v1 - i; l++) dp[l + i] = max(dp[l] + w[i], dp[l + i]); ``` 按照正确的思路,写出了这样的核心代码,然后就可以提交...... 按照正确的思路,写出了这样的核心代码,然后就可以提交…… 错! 让我们再回头看一下代码,i 表示当前判断的是第 i 个物体,l 则穷举体积,可是注意一个地方——l 是从 0 到 v1-v[i] 这意味着什么呢?举个栗子,可能在体积为 (l) 处取物体 i 新的 dp 值存到体积为 (l+v[i]) 处, 而在体积为 (l+v[i]) 处,物体 i 再次被取 这意味着什么呢?举个栗子,可能在体积为 (l) 处取物体 i 新的 dp 值存到体积为 (l+v[i]) 处,而在体积为 (l+v[i]) 处,物体 i 再次被取 所以,当以 0~v1-v[i]的顺序穷举时,物体实际上可能被加入多遍,这显然与题意不符 Loading Loading
.remarkrc +2 −1 Original line number Diff line number Diff line Loading @@ -3,12 +3,13 @@ "listItemIndent": "tab" }, "plugins": [ "remark-pangu", "remark-copywriting-correct", "remark-preset-lint-markdown-style-guide", ["remark-lint-code-block-style", false], ["remark-lint-maximum-line-length", false], ["remark-lint-ordered-list-marker-value", "ordered"], "remark-math", "remark-math-space", "remark-lint-final-newline", "remark-lint-no-tabs", "remark-clang-format" Loading
docs/basic/divide-and-conquer.md +2 −2 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ 介绍分治之前,首先要弄清楚递归这个概念。 递归是什么呢?举个简单的例子:从前有座山,山上有座庙,庙里有个老和尚,老和尚给小和尚讲故事:“从前有座山,山上有座庙,庙里有个老和尚,老和尚给小和尚讲故事:‘从前有座山......’” 这个故事与递归算法有着异曲同工之妙。 递归是什么呢?举个简单的例子:从前有座山,山上有座庙,庙里有个老和尚,老和尚给小和尚讲故事:“从前有座山,山上有座庙,庙里有个老和尚,老和尚给小和尚讲故事:‘从前有座山……’”这个故事与递归算法有着异曲同工之妙。 递归的基本思想是某个函数直接或者间接地调用自身,这样就把原问题的求解转换为许多性质相同但是规模更小的子问题。我们只需要关注如何把原问题划分成符合条件的子问题,而不需要去研究这个子问题是如何被解决的。 Loading
docs/basic/expression.md +6 −7 Original line number Diff line number Diff line Loading @@ -6,8 +6,7 @@ ## 递归 递归的方法是把表达式拆分成如图所示的表达式树,然后在树结构上自底向上进行运算。  递归的方法是把表达式拆分成如图所示的表达式树,然后在树结构上自底向上进行运算。 表达式树上进行[树的遍历](/graph/traverse/#dfs_3)可以得到不同类型的表达式 Loading
docs/basic/simulate.md +3 −3 Original line number Diff line number Diff line Loading @@ -8,6 +8,6 @@ 1. 在动手写代码之前,在草纸上尽可能的写好要实现的流程 2. 在代码中,尽量把每个部分模块化、写成函数、结构体或类 3. 对于一些可能重复用到的概念,可以统一转化,方便处理 : 如,某题给你 "YY-MM-DD 时: 分" 把它扔到一个函数处理成秒,会减少概念混淆 3. 对于一些可能重复用到的概念,可以统一转化,方便处理:如,某题给你 "YY-MM-DD 时:分" 把它扔到一个函数处理成秒,会减少概念混淆 4. 调试时分块调试,模块化的好处就是可以方便的单独调某一部分 5. 写代码的时候一定要思路清晰,不要想到什么写什么,要按照落在纸上的步骤写。
docs/dp/backpack.md +6 −6 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ 显而易见的是,可以计算总价值的,只有已经放入背包的物体,因此该题中对 "是否为最大值" 的判断是建立在 "已经放入背包之中" 的基础之上的 已知对于一个容量为 v1,可以放置第 1 到第 i 件物体的背包,其最大总价值很明显等于容量为 v1 的背包,放有第 1 到第 (i-1) 件物体时的最大值 (第 i 件物体不取时) 或者是容量为 v1-v[i]的背包,放有第 1 到第 (i-1) 件物体时的最大值 + w[i](第i件物体取时) 已知对于一个容量为 v1,可以放置第 1 到第 i 件物体的背包,其最大总价值很明显等于容量为 v1 的背包,放有第 1 到第 (i-1) 件物体时的最大值(第 i 件物体不取时)或者是容量为 v1-v[i]的背包,放有第 1 到第 (i-1) 件物体时的最大值 + w[i](第i件物体取时) 由此可以得出状态转移方程 Loading @@ -24,13 +24,13 @@ for (int i = 1; i <= v1; i++) for (int l = 0; l <= v1 - i; l++) dp[l + i] = max(dp[l] + w[i], dp[l + i]); ``` 按照正确的思路,写出了这样的核心代码,然后就可以提交...... 按照正确的思路,写出了这样的核心代码,然后就可以提交…… 错! 让我们再回头看一下代码,i 表示当前判断的是第 i 个物体,l 则穷举体积,可是注意一个地方——l 是从 0 到 v1-v[i] 这意味着什么呢?举个栗子,可能在体积为 (l) 处取物体 i 新的 dp 值存到体积为 (l+v[i]) 处, 而在体积为 (l+v[i]) 处,物体 i 再次被取 这意味着什么呢?举个栗子,可能在体积为 (l) 处取物体 i 新的 dp 值存到体积为 (l+v[i]) 处,而在体积为 (l+v[i]) 处,物体 i 再次被取 所以,当以 0~v1-v[i]的顺序穷举时,物体实际上可能被加入多遍,这显然与题意不符 Loading