如何解决算术词典问题?

时间:2019-12-01 13:30:01

标签: algorithm numbers dynamic-programming

给出从1到n的正整数。

通话总和(n)是n的数字总和。

调用STR(n)作为代表数字n的字符串。

按以下顺序排列这些数字: 当且仅当(1)或(2)满足以下条件时,我们x才位于y之前:

- (1) sumdigit (x) <sumdigit (y)

- (2) sumdigit(x)=sumdigit(y) && str(x)<str(y)

例如:

  • x = 301,y = 221-> x位于y之前(因为总和(x)

  • x = 201,y = 30-> x位于y之前(因为sumdigit(x)= sumdigit(y)和str(x)

  • x = 222,y = 213-> y在x之前(因为和数(x)=和数(y)和str(x)> str(y))


给出n <= 10 ^ 18和Q个查询的值

针对上述问题,有两种查询类型:

-在按上述规则排序的范围内找到第k个数字。 (k <= n)

  • 在根据上述规则排序的序列中找到数字k的序列号。 (k <= n)

我可以通过使用动态计划dp(n,sum)解决条件(1)的问题:x的数量具有 sumdigit(x)= sum和x <= n

-> We can count the number of x numbers with sumdigit (x) <sumdigit (k).

The problem I can't solve is the condition (2),
I can't think of a way to count the number of x numbers
with sumdigit(x)=sumdigit(k) and str(x)<str(k)

您能帮我解决条件(2)的问题吗?

我需要你的帮助!

1 个答案:

答案 0 :(得分:0)

这里有个提示:

让dp(d,l,s)表示第一个数字= d的数字的数量(d也可以为0),数字的长度<= l和数字的总和= s。

尝试找出递归。您如何使用它来解决问题?