|
楼主 |
发表于 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]
复制代码
|
|