
例题集——动态规划
文章平均质量分 71
动态规划
ThE.wHIte.
我永远喜欢古桥文乃!!!
展开
-
两道经典递推例题
这两个子集相加就是我们的全集,即 dp[i][j]。这样想可能有点难以理解,可以逆着想一下,假设现在你得到了 dp[i - j][j],这其实也就是 i - j 的拆分为 j 份的所有方案的总数,那么把这所有的方案里的那些被划分出来的数整体 + 1,其实也不难发现这就是 dp[i][j] 不算 1 的划分总数了。可以不必纠结于后者为什么是dp[i - x],试想 x 是 3,比它大的假如还剩4,5,6,7, 那么对于4,5,6,7如何排列而言,它们与1,2,3,4是毫无差别的。1 个整数,即不同的分法。原创 2025-03-21 15:04:10 · 1014 阅读 · 0 评论 -
Leetcode 139. 单词拆分
那么 dp[i] 可以用下列方式得到:我们对 dp[i] 之前的 dp[j] 值(i > j)进行搜索,对每一个 dp[j] 值为 true 的位置,我们寻找是否可能有一个单词能满足字符串 s 的前 j 个加上它之后就是字符串 s 的前 i 个,有则可以断定 dp[i] = true,如此递推。返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。原创 2025-02-12 21:09:40 · 252 阅读 · 0 评论 -
Leetcode 343. 整数拆分
借用容斥原理的思想,试想dp[i](其意义代码注释中已给出)可以用什么表示。我们将 i 拆分为 j 与 i-j 两部分,那么我们可以知道,dp[i] = max({dp[j]*(i-j),(i-j)*j,dp[i]}),这其实就相当于在对每个 i 拆分时去尝试遍历小于它的所有数,即 j ,本质依然是记忆化搜索。顺带提一嘴,这道题可以用贪心,这里给出一个结论:拆分某个数,使其乘积最大的方式是有3拆3,如果最后剩4则保留,否则依然继续拆3(例如如果还剩5的话,拆成3*2是最大的)。你可以获得的最大乘积。原创 2025-02-05 16:42:22 · 394 阅读 · 0 评论