![]() |
1
43
|
![]() |
2
52
快速无编程解决方案 (基于组合数学) 我认为“无回溯”意味着我们要么增加x,要么增加y。
唯一的问题是,这40项中的哪一项是x的20项增加。问题是:在一组40个元素中,有多少种不同的方法可以选择20个元素(这些元素是:步骤1,步骤2,等等,我们正在选择,比如说,在x中增加的元素。
这里有一个公式:它是一个二项系数,上面是40,下面是20。公式是
作为比较,请注意
|
![]() |
3
43
正如其他人所指出的,这个特殊问题有一个离散的数学解决方案。但假设您确实想要递归地解决它。你的表现问题在于你一次又一次地解决同样的问题。
你要求这个来计算Fib(5)。计算Fib(4)和Fib(3)。计算Fib(4)计算Fib(3)和Fib(2)。计算Fib(3)计算Fib(2)和Fib(1)。计算Fib(2)计算Fib(1)和Fib(0)。现在我们回去计算Fib(2) 再一次 . 然后我们回去计算Fib(3) 再一次 . 大量的重新计算。 假设我们缓存了计算结果。第二次请求计算时,我们只返回缓存的结果。现在是高阶技巧。我想将“缓存函数的结果”的概念表示为一个函数,它接受一个函数,并返回一个具有这个优良属性的函数。我将把它作为函数的扩展方法编写:
现在我们对Fib进行一些小的重写:
当我们调用Fib(5)时,现在我们进行字典查找。5不在字典中,因此我们调用原始函数。这就调用了Fib(4),它执行另一个字典查找,但未命中。这就叫Fib(3),以此类推。当我们回到把Fib(2)和Fib(3)称为 第二 随着时间的推移,结果已经在字典中,因此我们不会重新计算它们。 编写两个参数的版本:
不太难,留作练习。如果你这样做了,那么你可以把你原来漂亮的递归逻辑,简单地重写成一个lambda,然后说:
|
![]() |
4
19
虽然动态规划无疑是解决这类问题的正确方法,但这个特定实例显示了一种可以利用的规律性。
2n!是20+20的排列数,而两个n!说明和的排列方式相同。 |
![]() |
5
5
顺便说一句,您可以通过意识到2x3将具有与3x2相同的路径数量来进一步提高性能。您的记忆函数似乎只考虑正好是列x行的字符串。但是,您可以在记忆中包含2x3和3x2键的总路径。
|
![]() |
6
4
尽管动态编程看起来是解决这个问题的一种很有吸引力的方法(并使其成为一种有趣的编码挑战),但对数据结构的一点创造性思考有助于立即给出答案。
…(m+1)/(n*(n-1)*。。。1).
|
![]() |
7
3
Catalan Numbers 其中,使用泰勒级数的闭合公式可用。 因此,一个计算解决方案的程序可以计算二项式系数,如果你没有BigInt类,这很难得到正确的结果。。。 |
![]() |
8
1
考虑到这一点,可以将计算时间减半,一旦将其减少为正方形,网格将是对称的。因此,无论何时,只要在X和Y方向上有相等的空间来遍历剩余空间,就可以对增加的X行程和增加的Y行程使用相同的计算。
|
![]() |
9
1
|
![]() |
10
1
|
![]() |
11
1
这个问题比许多人想象的要简单得多。路径必须是具有20个“权限”和20个“向下”的序列。不同序列的数量是指你可以从可能的40个位置中选择20个位置(比如“权利”)。 |
![]() |
12
0
每个人都表示动态编程和缓存结果。 我在某个地方有一个Ruby脚本,结果是所有数据都存储在一个非常大的散列中。事实上,就像大多数Euler项目问题一样,这是一个隐藏的数学“把戏”,有很多方法可以通过简单的计算得到结果。 |
![]() |
13
0
我的解决方案是否定的,但很容易理解:
|
![]() |
14
0
这可以通过n个选择k个组合来完成。如果你看看这个问题,无论你选择从起始单元格到目标单元格的路径是什么,水平和垂直步数都是相同的。
使用生物棺材(a+b) a和be是水平和垂直台阶。
|
![]() |
Muhammad Umer · 为什么这个随机数猜谜游戏模拟产生5.8 8 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 9 月前 |
|
D W · Python-将浮点数从2转换为10到100位小数 10 月前 |
![]() |
Bartol · 确定python龟图形中的角度 1 年前 |
|
randomAlgo · 将弹簧设置为相同长度的成本最低 1 年前 |
![]() |
Fyodor · 在C中使用sin和cos计算数学表达式不正确? 1 年前 |
![]() |
Sergio · python中大量数字的乘法 1 年前 |