动态编程:计算之间的超级数

时间:2018-11-13 21:30:23

标签: algorithm dynamic-programming

给出两个数字,让我们将它们称为XY,以查找它们之间的所有“超级”数字。

  

超级数字是指其相邻数字具有绝对值的数字   差异大于1。因此,例如,数字132不是超级数字   因为   3和2的差等于1。数字62是超级数,因为   6和2之间的差异大于1。

如何使用动态编程查找X和Y(包括)之间的所有超数?

1 < X,Y < 10^5000 

1 个答案:

答案 0 :(得分:1)

您可以使用一种称为Digit DP的技术,也可以使用“ Dp on digit”。假设我们有一个函数f(x)告诉您0到x(含)之间的整数个数(如果您是超级数字)要计算X,Y之间的超数数量,您只需要计算f(Y)和f(X-1),因为X和Y之间的超数数量等于f(Y)-f(X- 1)(很容易注意到原因)。

那么函数f(x)应该是什么?您需要三种状态: index:您正在处理的字符串(数字)上的索引。 紧密:这将告诉您当前数字范围是否受到限制。

例如,如果您有电话号码:

1234可以达到0234、0000、1231等状态(数字小于或等于1234)

但是您无法到达:2234、1244等

严格控制这个问题。

last:最后使用的数字,这将帮助您进行转换,例如,如果您最后使用的数字是4,则下一个数字可以是0、1、2或6、7、8、9(仅当紧密不活跃)。

我给您提供了一个教程以及可以在其中找到更多信息的地方:

https://www.geeksforgeeks.org/digit-dp-introduction/在这里,您可以更好地了解该主意以及严格的用法。 您还可以在竞争性的编程页面上找到信息,例如codeforces,topcoder,codechef。

我通常会在竞争性编程中看到这些问题,这对某些法官来说是一个问题吗?我想尝试一个解决方案。 。如果是这样,我真的希望您不会参加现场比赛。