我正在完成一项任务: 程序获取一个数字作为输入,输出将是从0到达该数字所需的步数。 规则:
示例输入:
42
示例输出:
9
最短的解决方案是:
4 + 4 + 4 * 4 - 4 * 4 - 4 - 4 / 4
我并不真正需要整个解决方案,所以如果你能把我推向正确的方向,我们将非常感激。
感谢您的时间。
答案 0 :(得分:1)
我通常会从"天真"开始思考。解决方案,并尝试改进想法。
e.g。
Lv1:4
Lv2:4 + 4 = 8,4-4 = 0,4 * 4 = 16,4 / 4 = 1
Lv3:8 + 4,8-4,8 * 4,8 / 4 ,, 0 + 4,0-4,0 * 4,0 / 4 ......
...
当然:这具有指数级的复杂性,这是非常糟糕的。
我们可以看到很多分支都是" DEAD-ENDS"可以削减。 而且,一些(很多)数字会重复,他们的分支可以被重复使用'
换句话说:
为数字X创建节点时,将新节点保存在X,下的哈希值中
当你最终遇到X时,不是创建一个新节点,而是将它指向已经创建的节点
注意:此分支已停止,因为它正在循环,已知值。
我没有时间对此解决方案的复杂性进行建模,但对于大多数数字而言,它应该是可行的解决方案。
如果我们仔细观察,我们可以很容易地看到这棵树不会改变每个函数调用,对于任何一个数字...只有增长和扩展,
因此,在前几次运行之后,我们更有可能在我们的" hash"中找到所需的数字。 @〜O(1),
如果它不存在,那么如果我们没有,我们会更接近它。
这个想法并没有完成,但我认为值得你提一下 我们或许可以通过贪婪的方法逃脱:
x*4 < N
x+4<N
注意:您需要在此处考虑订单问题,以及数字可以包含在10,000左右的事实。
但这是一个开始。