Добавил:
lovickaaolesa
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:5 курс / lab2
.pydef matrix_chain_order(p):
n = len(p) - 1
m = [[0] * n for _ in range(n)]
s = [[0] * n for _ in range(n)]
for l in range(2, n + 1):
for i in range(n - l + 1):
j = i + l - 1
m[i][j] = float('inf')
for k in range(i, j):
cost = m[i][k] + m[k + 1][j] + p[i] * p[k + 1] * p[j + 1]
if cost < m[i][j]:
m[i][j] = cost
s[i][j] = k
return m, s
def print_optimal_parens(s, i, j):
if i == j:
print(f"A{i + 1}", end="")
else:
print("(", end="")
print_optimal_parens(s, i, s[i][j])
print_optimal_parens(s, s[i][j] + 1, j)
print(")", end="")
def main():
print("=== Оптимальное перемножение цепочки матриц ===")
print("Формат ввода: размеры p0, p1, ..., pn через пробел")
print()
try:
p = list(map(int, input("Введите размеры: ").split()))
if len(p) < 2:
print("Нужно хотя бы два числа (одна матрица).")
return
except ValueError:
print("Ошибка: введите целые числа.")
return
n = len(p) - 1
print(f"\nЧисло матриц: {n}")
for i in range(n):
print(f" A{i + 1}: {p[i]} x {p[i + 1]}")
m, s = matrix_chain_order(p)
print(f"\nМинимальное число скалярных умножений: {m[0][n - 1]}")
print("Оптимальная расстановка скобок: ", end="")
print_optimal_parens(s, 0, n - 1)
print()
if n <= 10:
print("\nТаблица m (стоимости):")
for row in m:
print(" ".join(f"{val:6d}" if val != float('inf') else " inf" for val in row))
print("\nТаблица s (разделители):")
for row in s:
print(" ".join(f"{val:3d}" for val in row))
if __name__ == "__main__":
main()
Соседние файлы в папке 5 курс
