Задача:
Начиная в вершине треугольника (см. пример ниже) и перемещаясь вниз на смежные числа, максимальная сумма до основания составляет 23.
3
7 4
2 4 6
8 5 9 3
То есть, 3 + 7 + 4 + 9 = 23.
Найдите максимальную сумму пути от вершины до основания следующего треугольника:
(Треугольник будет в решении)
Мой код:
line = '''75
95 64
17 47 82
18 35 87 10
20 04 82 47 65
19 01 23 75 03 34
88 02 77 73 07 63 67
99 65 04 28 06 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 43 91 52 97 51 14
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23'''
data = line.split('\n')
arr = []
for line in data[::-1]:
arr.append(line.split(' '))
arr_for_summary = []
ind = 0
arr2 = []
arr3 = []
for a in arr:
for b in a:
if len(a) > 1:
c = arr[arr.index(a)+1]
else:
break
if ind < len(c):
res = int(b) + int(c[ind])
if b not in arr2:
res2 = int(a[a.index(b) + 1]) + int(c[ind])
else:
res2 = int(a[a.index(b,arr2.index(b)) + 1]) + int(c[ind])
arr_for_summary.append(res)
arr_for_summary.append(res2)
arr2.append(b)
ind+=1
else:
break
if arr_for_summary:
arr3.append(arr_for_summary)
arr_for_summary = []
arr2 = []
ind = 0
arr.pop(0)
arr3.append([75])
for row in arr3:
print(row)
Мой алгоритм основывавается на том, чтобы найти сумму всех чисел в каждых 2-ух рядах, и получить двухмерный массив, в котором суммы 1-го и 2-го ряда, 3-го и 4-го ряда и т.д
Вот что получается при выводе:
[67, 125, 128, 164, 102, 31, 95, 91, 112, 98, 62, 123, 137, 165, 128, 57, 146, 166, 109, 54, 107, 122, 140, 147, 100, 44, 35, 93]
[161, 141, 82, 63, 85, 71, 66, 45, 94, 91, 87, 164, 108, 88, 121, 136, 97, 89, 118, 95, 44, 46, 86, 105]
[94, 112, 119, 92, 116, 137, 98, 58, 72, 90, 75, 123, 128, 89, 68, 113, 191, 145, 80, 43]
[140, 140, 106, 106, 30, 60, 84, 111, 89, 46, 56, 96, 150, 140, 162, 125]
[107, 21, 3, 78, 100, 96, 148, 82, 10, 66, 97, 101]
[38, 22, 39, 117, 169, 134, 57, 75]
[112, 142, 111, 146]
[75]
И вот у меня произошёл ступор, на моменте с перебором всех комбинаций для максимального значения суммы.
Это код, который идёт после вывода значений, чтобы найти максимальную сумму:
result = 0
iterator = 0
for row in arr3:
row2 = row[:]
while len(row) > 1:
max_number = max(row)
index = row2.index(max_number)
if iterator == 0 or index - previous_index == 0 or abs(index - previous_index) == 1:
result += max_number
previous_index = row.index(max_number) - 1
iterator += 1
row.remove(max_number)
break
row.remove(max_number)
print(result + 75)
Может найти лишь максимальную сумму при первом максимальном значении. Но вот как поменять первое максимальное значение несколько раз в ходе выполнения программы я не понимаю, т.к для проверки могу ли я сложить суммы рядов мне нужна переменная
previous_index, а она получается только после 1-ой отработки программы. Вообщем я зашёл в тупик. Как это реализовать?
Мой ответ 1064, правильный 1074