最大为 N 的数字组合
发布时间:2022-10-19 13:35:03 427
相关标签: # git# 信息
题目
给定一个按 非递减顺序 排列的数字数组 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 实现:
总结
动态规划是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
文章来源: https://blog.51cto.com/u_13961087/5765048
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报