【发布时间】:2017-11-29 08:04:33
【问题描述】:
我有一个动态编程练习,但我不知道它在这里如何工作:
我们有一个神秘的数字是一个由数字和星号*组成的字符串。 给定一个神秘数,计算所有可能的自然数,将星号 * 替换为一个数字,得到一个可被 n 整除的整数。 例如:
对于 1*1* 和 n = 6,有 16 个可能的数可以被 n 整除:1014, 1110, 1116, 1212, 1218, 1314, 1410, 1416, 1512, 1518, 1614, 1710, 1716, 1812, 1818, 1914.
如果有一个前导星号,那么它不应该被零替换:
*12 -> 112(可以)但 *12 -> 012(不可以)
输入:
1
1
时间限制:
在 C++ 语言中为 500 毫秒。正如我所说,这是一个动态编程练习。
谁能给我一些提示?
【问题讨论】:
-
您是否提前知道
n的值,或者那是您程序输入的一部分? (如果事先知道可能有捷径:对于n=6,最后一个数字必须是偶数,并且数字之和必须是3的倍数。)如果事先不知道n,那么暴力破解是否有问题(用数字替换星号并用n除以测试所有可能性)?您的编程语言中的字符串大小或整数大小是否有限制?好的解决方案需要这些细节。 -
抱歉我的错误,n 是事先不知道的:n 在 1-1000 的范围内,神秘数字的大小在 1 -1000 的范围内,时间限制为 500ms,使用 C++ 语言。所以我不认为会有蛮力@RoryDaulton的地方
-
如果你需要我可以给你递归算法的代码。但不知道动态。 500毫秒也是很多时间!!!!!!这个算法只需要 1ms
-
我同意:500 毫秒是很多时间。考虑到您的限制,最多可以通过蛮力轻松完成 3 颗星。
标签: math dynamic-programming integer-division