这是我的面试问题之一,我想不出获得N号的好方法。(此外,我也不了解美式足球计分系统)
6 points for the touchdown 1 point for the extra point (kicked) 2 points for a safety or a conversion (extra try after a touchdown) 3 points for a field goal
什么是一种有效的算法,以获得获得一定分数N所需的点累积的 所有 组合?
假设在这里,您正在寻找一种获取可能性的数量而不是实际可能性的方法。
首先让我们找到一个 递归函数 :
f(n) = (f(n-6) >= 0? f(n-6) : 0) + (f(n-1) >= 0 ? f(n-1) : 0) + (f(n-2) >= 0 ? f(n-2) : 0) + (f(n-3) >= 0 ? f(n-3) : 0)
基数:f(0) = 1和f(n) = -infinity [n<0]
f(0) = 1
f(n) = -infinity [n<0]
其背后的想法是:您总是可以0通过无计分游戏进入。如果可以到达f(n-6),您还可以到达f(n),依此类推。
0
f(n-6)
f(n)
使用上述公式可以轻松创建递归解决方案。
请注意,您甚至可以使用它进行 动态编程 ,使用[-5,n]初始化表,init f[0] = 0和f[-1] = f[-2] = f[-3] = f[-4] = f[-5] = -infinity对索引[1,n]进行迭代,以根据上述递归公式获得多种可能性。
f[0] = 0
f[-1] = f[-2] = f[-3] = f[-4] = f[-5] = -infinity
[1,n]
编辑: 我刚刚意识到上述公式的简化版本可能是: f(n) = f(n-6) + f(n-1) + f(n-2) + f(n-3) 并且基数将是:f(0) = 1,f(n) = 0 [n<0] 这两个公式将产生完全相同的结果。
f(n) = f(n-6) + f(n-1) + f(n-2) + f(n-3)
f(n) = 0 [n<0]