最大为 N 的数字组合
题目
给定一个按 非递减顺序 排列的数字数组 digits 。你可以用任意次数 digits[i] 来写的数字。例如,如果 digits = ['1','3','5'],我们可以写数字,如 '13', '551', 和 '1351315'。
返回 可以生成的小于或等于给定整数 n 的正整数的个数 。
题解
数位 DP 入门题:
题目要求返回通过 digits 中的数字可以生成的<=正整数 n 的正整数个数
如:digits=["1","3"] n=52 答案是:1,3,11,13,31,3
将 digits 转化为 int 数组类型的 nums
记 nums 的长度为 M,f(x)为 nums 能组成的位于[1,x]的数字个数,正整数 x 的长度为 N
我们可以大体将[1,x]的数字分为 3 个部分:
位数小于 N 的部分,这部分可通过计算得到,设此时数字的位数为 k,那么这部分个数为 ∑M^k(k∈[1,N-1])(nums 数字可以复用)
位数等于 N 的部分,且最高位比 x 最高位小,这部分也可通过计算得到,设 r 为 nums 在 x 对应位能取到的数字最大索引那么 x 对应位可以取到 digits[0,r],后面任意取都不会超过 x,因此这部分个数为 (r+1)*M^(N-p),其中 N-p 表示当前位后面还有多少位数
位数等于 N 的部分,且最高位等于 x 最高位,最高位处保守只能取到 digits[0,r-1],这部分个数为 r*M^(N-p)
还没完,还要累加最高位为 digits[r]的情况,这取决于后面数字的贡献数,参考下一位数属于哪种情况最后答案就是 f(n)
JS 实现:
总结
动态规划是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
版权声明: 本文为 InfoQ 作者【掘金安东尼】的原创文章。
原文链接:【http://xie.infoq.cn/article/c10ef40bd362b0672675c51f5】。文章转载请联系作者。
评论