【发布时间】:2013-11-26 13:35:16
【问题描述】:
我能够使用递归 DP 解决标题中给出的问题,但得到了 TLE。这是因为输入字符串可能有大约 5000 位数字,这会导致大量子函数调用,并且我的程序无法计算结果,即使在我的计算机上也是如此。
问题如下: ACODE
我的解决方案如下:
import sys
def chk(word):
if word[0] == '0':
return 0
if int(word) < 27 and int(word) > 0:
return 1
else:
return 0
def dp(line):
if len(line) > 2:
return chk(line[0])*dp(line[1:]) + chk(line[:2])*dp(line[2:])
elif len(line) > 1:
return chk(line[0])*dp(line[1]) + chk(line)
else:
return chk(line)
line = sys.stdin.readline().strip()
while line != '0':
print dp(line)
line = sys.stdin.readline().strip()
搜索互联网导致以下解决方案:
1) 用 0 和元素 0 初始化一个大小为 N 的数组为 1
2) 遍历所有元素
3) 如果是有效的个位数,将前一个元素的值复制到当前元素 (DP[i] = DP[i-1])
4)如果是有效的两位数,将前一个元素的值添加到当前元素(DP[i] += DP[i-2])在一行中:DP[i] = DP[i-1] {如果有效的单个数字} + DP[i-2] {如果当前和以前的元素构成有效的两位数}
我不确定我是否在做同样的事情,因为我无法理解上述方法,或者是否有某种方式可以将我的递归方法转变为迭代。
【问题讨论】:
-
你没有做同样的事情。您的算法具有指数级运行时复杂性,因为您不会记住子问题的结果(而是一遍又一遍地重新计算它们)。
-
在这种情况下如何记忆结果?
-
@KartikAnand 看看my answer 以获取 Niklas 建议的备忘录。
-
你应该使用索引来表示你的字符串的前缀而不是字符串,否则即使你添加了memoization,你也可能会耗尽内存和时间。
标签: python algorithm dynamic-programming