这是1012.左代码上至少一个重复的数字,这很困难。
标签:“动态计划”,“数字DP”,“原理原理”
考虑到一个正整数$ n $,并返回到$ [1,n] $范围内至少1位重复数字的正整数数量。
示例1:
示例2:
示例3:
暗示:
第一个$ [1,n] $ a总计$ n $,以及$ [1,n]的“至少$ 1 $数字重复”的数量相当于“总数$ $ $ $ $n $“减”数字无重复”。
因此,问题转换为:如何求解“无重复”的数量,同时,为了更笼统,我们将在$ [1,n]范围内求解“无重复”的数量$,并修改$ [0,n]范围内“无持续时间”的数量。
问题要转换为(解释)357。统计数字的高级部分具有不同的数字。
假设我们具有函数函数,我们可以在间隔$ [0,x] $中返回法定数字数量,然后我们可以回答任何间隔法律编号的查询:
$ o ans _ {(l,r)} = dp(r)-dp(l -1)$ $
然后考虑如何实施该功能,我们将形成$ [0,x] $的法定数量分为三类:
解决方案相对简单,重点是如何解决它。
对于$ x $的“从高到低”(假设$ x $ $ n $),对于$ k $($ k $不是最高位),假设它是$ x $ 1中的第一号$ k $ bit是$ cur $。为了满足“尺寸限制”关系,我们只能在$ [0,cur -1] $的范围内获取数字。我们需要使用变量$ s $记录使用情况(是否数量数量$ s $的of指示数字$ $ [0,9] $),统计$ [0,cur -1] $在相同的三个限制条件中的同时间记录为$ cnt $。
在$ k $ digits具有合法选择$ cnt $之后,可以在任何条件下选择“只能使用一次相同的数字”的位数(因为$ k $ bit保证了尺寸的关系),为了快速了解剩余的$ n -k $数字有多少个解决方案,我们还需要准备产品的产品,其中$ f [l] [r] $代表$ l(l + 1)。。(j -1 1))J $的产品总和。
如果上述解释感觉抽象,我们可以提出它吗?假设$ x = 678 $,我们应该如何解决:因为数字与“数字和$ x $”的数字相同,而最高级别是$ x $的最高级别”位不是选择,只能是$ 6 $,然后考虑处理次要高,次级高是$ x $中的$ 7 $。为了满足尺寸的关系,我们只能在$ [0,0,6] $ do限制在范围内。与此同时,由于使用了$ 6 $,因此高位置实际上仅为$ [0,5] $,总计$ 6 $选择。$ P = 2 $位(即,消耗$ p $不同的数字),因此从位数开始,应为$ a = 10 -p $,启动并将其带到$ b =(10 -p) - (n -p) +1 $,也就是说,目前的解决方案数为$ cnt * f [b] [a] $(当前位不是最低位)或$ cnt $(当前位是最低级别).Treat根据此逻辑周期的所有数字,直到重复值或末端结束为止。
应该注意的是,上述示例仅仅是为了使每个人都能理解该过程。据了解,示例部分并不代表建立数字DP实践的固有条件。示例理解算法绝不是科学方法。
其他详细信息:产品的预处理与样品无关。我们可以使用手表优化,同时我们可以与两种情况合并。
代码:
在第一篇数字DP系列文章中也提到了同样的摘要。考虑到新学生第一次看这个系列,然后提到:
数字DP的难度取决于“限制”,而LC上只有几个数字DP问题很小,并且不需要其他数据结构来记录状态。(LC的难度很难)。
几乎所有数字DP问题都可以汇总到上述解决方案:“将一个$ [0,x] $/$ [1,x] $ range解决方案的问题抽象的方法抽象了” - >数字数量的讨论:条件+不同的情况“ - >”当具有相等数字统计数据的方案数量时,有必要处理它并根据极限条件进行逻辑;进行一些预处理,然后直接计算乘法原理。“
既然它没有参与数字DP腐烂的街道,那么掌握普遍定位为“难度”的数字DP类型非常有效。
在一系列“动态计划数字DP”系列中,我将带所有人在LC上进行所有“数字DP”类型的主题。
这是我们“通过Leetcode”系列的第一篇文章。该系列始于2021/01/01。从开始开始时的起始代码开始,总共有1916年的问题。该主题已经完成。
在这一系列文章中,除了解释问题 - 解决想法之外,还将尽可能多地提供最简洁的代码。如果涉及通信,将有相应的代码模板。
为了使学生更容易在计算机上调试和提交代码,我建立了一个相关的仓库:https://github.com/sharingsource/logicstack-letcode。
在仓库地址中,您可以看到一系列文章的解释链接,一系列文章的相应代码,leetcode的原始链接以及其他首选解决方案。
原始:https://juejin.cn/post/70966666256471752740