| 
 | 
 
 
 楼主 |
发表于 2019-1-11 21:15:38
|
显示全部楼层
 
 
 
 本帖最后由 Stubborn 于 2019-1-12 05:32 编辑  
- def longest_slide_down(pyramid):
 
 -     def findway(x, y):
 
 -         if not visited[x][y]:
 
 -             visited[x][y] = True
 
 -             for m in move:
 
 -                 nx, ny = x + m[0], y + m[1]
 
 -                 if 0 <= nx < len(pyramid) and 0 <= ny <= nx:
 
 -                     dp[nx][ny] = max(dp[x][y] + pyramid[nx][ny], dp[nx][ny])
 
 -                     checklist.append((nx, ny))
 
  
-     visited = [[False] * (i + 1) for i in range(len(pyramid))]
 
 -     dp = [[0] * (i + 1) for i in range(len(pyramid))]
 
 -     move = [(1, 0), (1, 1)]
 
 -     checklist = [(0, 0)]
 
 -     dp[0][0] = pyramid[0][0]
 
  
-     max = 0
 
  
-     while True:
 
 -         for i in range(len(checklist)):
 
 -             findway(checklist[i][0], checklist[i][1])
 
 -         if len([(j, k) for j in range(len(pyramid)) for k in range(j) if not visited[j][k]]) == 0:
 
 -             visited = [[False] * (i + 1) for i in range(len(pyramid))]
 
 -             checklist = [(0, 0)]
 
 -             if max < max(dp[len(pyramid)-1]):
 
 -                 max = max(dp[len(pyramid)-1])
 
 -             else:
 
 -                 break
 
 -     return max
 
  复制代码 
- def longest_slide_down(p):
 
 -     res = p.pop()
 
 -     while p:
 
 -         tmp = p.pop()
 
 -         res = [tmp[i] + max(res[i],res[i+1])  for i in range(len(tmp))]  #把tmp的每个值。加上tmp值对应上方res较大的一个值。
 
 -     return res.pop()
 
 - #代码分析=========保持res为最后一列,tmp为倒数第二列
 
 - aa=[[4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23],
 
 -    [63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31],
 
 -    [91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48],
 
 -    [70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57],
 
 -    [53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14],
 
 -    [41, 48, 72, 33, 47, 32, 37, 16, 94, 29],
 
 -    [41, 41, 26, 56, 83, 40, 80, 70, 33],
 
 -    [99, 65, 4, 28, 6, 16, 70, 92],
 
 -    [88, 2, 77, 73, 7, 63, 67],
 
 -    [19, 1, 23, 75, 3, 34],
 
 -    [20, 4, 82, 47, 65],
 
 -    [18, 35, 87, 10],
 
 -    [17, 47, 82],
 
 -    [95, 64],
 
 -    [75]]
 
  复制代码 
- def longest_slide_down(pyramid):
 
 -         "从后面开始处理"
 
 -     for i in range(len(pyramid)-2,-1,-1):  #i为13到0
 
 -         for j in range(i+1):  #第一次0-13 每循环一次-1
 
 -             pyramid[i][j] += max([pyramid[i+1][j],pyramid[i+1][j+1]])
 
 -                 #  倒数第二列第j个值    +=   max(最后一列,j对应的二个值)
 
 -     return pyramid[0][0]
 
  复制代码 
- class Tree(object):
 
 -     value = summ = None
 
 -     left = right = None
 
 -     
 
 -     def __init__(self, value):
 
 -         self.value = value
 
  
 
- def iter_pairs(level):
 
 -     it = iter(level)
 
 -     a, b = Tree(next(it)), Tree(next(it))
 
 -     while b.value is not None:
 
 -         yield a, b
 
 -         a, b = b, Tree(next(it, None))
 
  
 
- def build_tree(pyramid):
 
 -     it = iter(pyramid)
 
 -     root = Tree(next(iter(next(it))))
 
 -     prev_level = iter([root])
 
 -     for level in it:
 
 -         tree_level = []
 
 -         parent = next(prev_level)
 
 -         
 
 -         for left_tree, right_tree in iter_pairs(level):
 
 -             tree_level.append(left_tree)
 
  
-             parent.left = left_tree
 
 -             parent.right = right_tree
 
 -             parent = next(prev_level, None)
 
 -             
 
 -         tree_level.append(right_tree)
 
 -         prev_level = iter(tree_level)
 
  
-     return root
 
  
 
- def calc_max_sums(root):
 
 -     if root is None:
 
 -         return 0
 
  
-     if root.summ is not None:
 
 -         return root.summ
 
  
-     root.summ = root.value + max(calc_max_sums(root.left), calc_max_sums(root.right))
 
 -     return root.summ
 
  
 
- def find_max_slide(root):
 
 -     if root is None:
 
 -         return 0
 
  
-     if not (root.left and root.right):
 
 -         return root.value
 
  
-     if root.left.summ >= root.right.summ:
 
 -         return root.value + find_max_slide(root.left)
 
 -     
 
 -     if root.left.summ < root.right.summ:
 
 -         return root.value + find_max_slide(root.right)
 
  
 
- def longest_slide_down(pyramid):
 
 -     tree = build_tree(pyramid)
 
 -     calc_max_sums(tree)
 
 -     return find_max_slide(tree)
 
  复制代码 
- def longest_slide_down(tri):
 
 -   while len(tri) > 1:
 
 -     t0 = tri.pop()
 
 -     t1 = tri.pop()
 
 -     tri.append([max(t0[i], t0[i+1]) + t for i,t in enumerate(t1)])
 
 -   return tri[0][0]
 
  复制代码 
- from operator import add
 
 - def longest_slide_down(pyramid):
 
 -     return reduce(lambda x, y: map(add, map(max, x[1:], x[:-1]), y), reversed(pyramid))[0]
 
  复制代码 
- from itertools import izip
 
  
- def longest_slide_down(pyramid):
 
 -     sums = pyramid[-1]
 
 -     for row in pyramid[-2::-1]:
 
 -         sums = [a + max(b, c) for (a, b, c) in izip(row, sums, sums[1:])]
 
 -     return sums[0]
 
  复制代码 
- def longest_slide_down(p):
 
 -     p[-1] = map(max, zip(p[-1][:-1], p[-1][1:]))
 
 -     p[-2] = map(sum, zip(p[-1], p[-2]))
 
 -     return longest_slide_down(p[:-1]) if len(p) > 2 else p[0][0]
 
  复制代码 
- def longest_slide_down(pyramid):
 
 -     return reduce(lambda prev, cur: map(lambda (i, el): el + max(prev[i], prev[i+1]), enumerate(cur)), reversed(pyramid))[0]
 
  复制代码 
- def longest_slide_down(a):
 
 -   return longest_slide_down(a[:-2]+[[a[-2][i]+max(a[-1][i],a[-1][i+1]) for i in xrange(len(a[-2]))]]) if len(a)>1 else a[0][0]
 
  复制代码 
- longest_slide_down = lambda l:reduce(lambda x,y:[max([x[i],x[i+1]])+y[i] for i in range(len(y))],l[::-1])[0]
 
 
  复制代码 
 
 |   
 
 
 
 |