Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

5 курс / lab2

.py
Скачиваний:
0
Добавлен:
26.01.2026
Размер:
2.1 Кб
Скачать
def 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 курс