“三角形之和”:Codechef如何针对速度和大型测试用例优化代码?

时间:2015-12-15 13:09:12

标签: python python-3.x

我是一名Python新手。

以下是codechef.com Link to problem

的初学者问题

问题文字:

让我们考虑一个数字的三角形,其中一个数字出现在第一行,两个数字出现在第二行,三个出现在第三行,等等。开发一个程序,它将计算出现的最大数字总和在从顶部到底部的路径上,以便:

  • 在每条路径上,下一个数字位于下面的行中,更多 正好在正下方或下方以及右侧的一个地方;
  • 行数严格为正,但小于100
  • 所有数字都是O和99之间的正整数。

输入

在第一行中整数n - 测试用例的数量(等于大约1000)。然后是n个测试用例。每个测试用例都以行数开头,后面跟着它们的内容。

输出

对于每个测试用例,将确定的值写在单独的行中。

enter image description here

以下是我的代码

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

代码解释(社论的相关部分):

Relevant part of editorial

(我在上面的代码中使用tempij进行缓存。类似于SO问题:SO question about memoization

虽然它适用于作为示例给出的测试用例,但似乎超出了其他测试用例的时间限制。

我的问题:如何改进此代码?或者,还有更好的方法?

2 个答案:

答案 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))

enter image description here

最初的问题仍然存在。使用python本身可以更快更好吗?我检查了使用其他语言(如C / C ++)的人的运行时间,它低至0:08,而对于python 3.x则为0.57!