我刚刚发现了SPOJ网站,我提交了我的第一个问题解决方案:Alphacode http://www.spoj.com/problems/ACODE/
在线评委用以下代码回答了NZEC错误,我不明白为什么。我选择了Python 3.2.3(functools.lru_cache出现在Python3.2中),我也尝试删除lru_cache并用memoize装饰器替换它,但同样的问题。
from functools import lru_cache
@lru_cache(maxsize=10000)
def acode(s, i=0):
if i == len(s):
return 1
if s[i] == "0":
return 0
res = acode(s, i+1)
if i + 1 < len(s) and (10 * int(s[i]) + int(s[i+1]) <= 26):
res += acode(s, i+2)
return res
def main():
i = input().strip()
while i != "0":
print(acode(i))
i = input().strip()
if __name__ == "__main__":
import sys
try:
main()
except:
sys.exit(0)
您可以使用以下命令对其进行测试:
$ echo "123\n1111\n21\n0" | python3 acode.py
注意:我也提交了没有“try:except:”但我在SPOJ网站上找不到输出日志。
答案 0 :(得分:0)
您的计划似乎没有给NZEC(至少现在)。但是,它以WA代码为止。
但是,如果我使用动态编程显式地滚动数组,而不是使用LRU Cache,它将被接受
from functools import lru_cache
@lru_cache(maxsize=10000)
def acode(s, i=0):
if i == len(s):
return 1
if s[i] == "0":
return 0
res = acode(s, i + 1)
if i + 1 < len(s) and (10 * int(s[i]) + int(s[i + 1]) ≤ 26):
res += acode(s, i + 2)
return res
def acode_second_try(s):
n = len(s)
f = [0 for i in range(1 + n)]
f[n] = 1
for i in range(n - 1, -1, -1):
if s[i] != '0':
f[i] = f[1 + i]
if 1 + i < n:
if 10 * int(s[i]) + int(s[1 + i]) ≤ 26:
f[i] += f[2 + i]
return f[0]
def main():
i = input().strip()
while i[0] != '0':
print(acode_second_try(i))
#print(acode(i))
i = input().strip()
if __name__ == "__main__":
import sys
try:
main()
except:
sys.exit(0)
答案 1 :(得分:0)
您收到NZEC错误,因为超出了python运行时的最大递归深度。
答案 2 :(得分:0)
我遇到了确切的问题! 因为我写了几乎完全相同的代码! :P
@ rabih-kodeih是正确的,这是因为超出了递归深度。我通过
解决了这个问题 closeEntry()
使用sys.setrecursionlimit(10**6)
库,您可以设置递归限制!
注意:这也有其限制,如果输入值足够高,则它也有可能超过堆内存。因此,此解决方案可解决SPOJ的问题,但请谨慎使用。