• Home
  • About
    • JOOS photo

      JOOS

      Joos's blog

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[leet_code] 1130. Minimum Cost Tree From Leaf Values with python3

16 Sep 2019

Reading time ~2 minutes

문제 : https://leetcode.com/problems/minimum-cost-tree-from-leaf-values/

목표:

  • 부모노드는 자식 노드 들 중에 가장 큰 수의 곱으로 만들어진다.
  • 그 곱들의 합 중에 가장 작은 수를 구하라
  • tree는 in

조건:

  • 2 <= arr.length <= 40
  • 1 <= arr[i] <= 15
  • It is guaranteed that the answer fits into a 32-bit signed integer (ie. it is less than 2^31)

    solution 설명 :

  • 다 해보는 것이다.

Input: [5, 2, 3, 4, 6]
1st step -> get value [5, 2] = 10 / [2, 3] = 6 / [3, 4] = 12 / [4, 6] = 24
dp[0, 1] = 10 / dp[1, 2] = 6/ dp[2, 3] = 12 / dp[3, 4] = 24
2nd step -> calculate [5, 2, 3] / [2, 3, 4] / [3, 4, 6]
dp[0, 2] = Min(dp[0, 1] + Max[0, 1] * arr[2], dp[1, 2] + Max[1, 2] * arr[0]);
dp[1, 3] = ..
dp[2, 4] = ..
3rd -> [5, 2, 3, 4] / [ 2, 3, 4, 6]
dp[0, 3] = ..
dp[1, 4] = ..

알고리즘 출처:https://leetcode.com/problems/minimum-cost-tree-from-leaf-values/discuss/381340/JAVA-DP-solution

def get_max(arr, i, j):
    max_num = arr[i]
    # i부터 j까지 중에서 가장 큰 수
    while i<=j:
        max_num = max(arr[i], max_num)
        i +=1
    return max_num


def mctFromLeafValues(arr):
    x = len(arr)
    dp = [[0]*x for _ in range(x)]

    for Len in range(1, x):
        for l in range(0, x-Len):
            r = l+Len
            # 길이 별로 지금 만들고 나누는 것이다.
            if Len == 1:
                dp[l][r] = arr[l]*arr[r]
            else:
                for k in range(l, r):
                    if dp[l][r] == 0:
                        # 값 없으면
                        dp[l][r] = dp[l][k] + dp[k+1][r] + get_max(arr, l, k) * get_max(arr, k+1, r)
                        # get_max(arr, l, k) * get_max(arr, k+1, r) 이건 해당 길이의 루트 노드의 값을 알려주는 것이다.
                        # 값 넣기
                    else:
                        dp[l][r] = min(dp[l][r], dp[l][k] + dp[k + 1][r] + get_max(arr, l, k) * get_max(arr, k + 1, r))
                        # 더 작은 값 넣기
    return dp[0][x - 1]


algorithmleet_codepython Share Tweet +1