我是一名Python新手。
以下是codechef.com Link to problem
的初学者问题问题文字:
让我们考虑一个数字的三角形,其中一个数字出现在第一行,两个数字出现在第二行,三个出现在第三行,等等。开发一个程序,它将计算出现的最大数字总和在从顶部到底部的路径上,以便:
输入
在第一行中整数n - 测试用例的数量(等于大约1000)。然后是n个测试用例。每个测试用例都以行数开头,后面跟着它们的内容。
输出
对于每个测试用例,将确定的值写在单独的行中。
以下是我的代码:
tempij=[]
s=0
def solve(i,j,ll):
global s
s=0
tempij=[]
if i==len(ll):
return 0
elif (i,j) in tempij:
return s
else:
tempij.append((i,j))
t1=solve(i+1,j,ll)
t2=solve(i+1,j+1,ll)
t=max(t1,t2)+ll[i][j]
s=t
return t
t=int(input())
ll=[]
for k in range(t):
ll=[]
n=int(input())
for i in range(n):
lst=[]
text=input().split()
for j in range(len(text)):
lst.append(int(text[j]))
ll.append(lst)
print(solve(0,0,ll))
此代码出现问题:
我已经尝试按照他们关于这个问题的社论来实现Reveyion with Memoization。 Link to editorial
代码解释(社论的相关部分):
(我在上面的代码中使用tempij进行缓存。类似于SO问题:SO question about memoization)
虽然它适用于作为示例给出的测试用例,但似乎超出了其他测试用例的时间限制。
我的问题:如何改进此代码?或者,还有更好的方法?
答案 0 :(得分:1)
我不相信你的记忆正在发挥作用。每次拨打solve
时,都会泄露您的缓存,并且您有一个影响全局副本的本地tempij
。此外,您只需在s
中一次存储一个计算值,因此即使它正常工作,您在大多数情况下也可能无法检索到正确的缓存值。暂且不使用全局变量(颤抖),我认为你应该使用更像
cache = {}
def solve(i,j,ll):
global cache
if i==len(ll):
return 0
elif (i,j) not in cache:
t1=solve(i+1,j,ll)
t2=solve(i+1,j+1,ll)
t=max(t1,t2)+ll[i][j]
cache[(i, j)] = t
return cache[(i, j)]
答案 1 :(得分:0)
我意识到自己的错误。感谢JCVanHamme。
由于JCVanHamme提到的原因,上面的代码没有正确缓存。每次通话后我都在重置缓存。所以我废除了所有创建问题的全局变量(因为它们必须为每个测试用例重新设置,这就产生了问题)。修改后的代码如下:
def solve(i,j,ll,cache):
if i==len(ll):
return 0
elif (i,j) not in cache:
t1=solve(i+1,j,ll,cache)
t2=solve(i+1,j+1,ll,cache)
t=max(t1,t2)+ll[i][j]
cache[(i, j)] = t
return cache[(i, j)]
t=int(input())
ll=[]
cache={}
for k in range(t):
ll=[]
cache={}
n=int(input())
for i in range(n):
lst=[]
text=input().split()
for j in range(len(text)):
lst.append(int(text[j]))
ll.append(lst)
print(solve(0,0,ll,cache))
最初的问题仍然存在。使用python本身可以更快更好吗?我检查了使用其他语言(如C / C ++)的人的运行时间,它低至0:08,而对于python 3.x则为0.57!