【问题标题】:Dynamic programming: Counting super numbers in between动态规划:计算中间的超数
【发布时间】:2018-11-13 21:30:23
【问题描述】:

给定两个数字,让我们称它们为XY 如何找到它们之间的所有“超级”数字。

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

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

1 < X,Y < 10^5000 

【问题讨论】:

  • 我强烈建议您进行可信的尝试并根据该尝试提出问题。

标签: algorithm dynamic-programming


【解决方案1】:

您可以使用一种称为“数字 DP”或“数字上的 Dp”的技术。假设我们有一个函数 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 等竞争性编程页面上找到信息。

我通常在竞争性编程中看到这些问题,这对某些评委来说是个问题吗?我想尝试一个解决方案。 .如果是这样的话,我真的希望你没有参加现场比赛。

【讨论】:

    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2012-10-17
    相关资源
    最近更新 更多