파일 합치기

2020-10-16 백준에 시간을 굉장히 많이 할애한 날이었는데, 대부분 포기하고 끝났다.

  • 아기상어
  • 스타트 택시
  • 1,2,3더하기3

BFS를 진짜 잘 못하는구나 하고 느꼈던 하루였다. (많이 안풀어봐서 당연한거지만..)

문제 분석

파일 합치기 문제도 일주일 전에 풀다가 포기했던 문제였다. 그 당시에 점화식 까지는 잘 찾았었는데 구현하는데서 꼬여서 스트레스를 받았던 것 같다. 오늘도 풀면서 꼬일뻔 했는데, 잘 해결 되었다. 풀고 나서 다른 블로그들과 비교를 해봤는데 비슷하면서도 달랐다. 이렇게 구현하는게 맞는 방법인진 정확히 모르겠다.

먼저 N X N DP리스트를 만들었다. DP[x][y]에 x+1번째 수 부터 y+1번째 수 까지 합치는데 드는 최소 비용을 넣을 예정이다. 우선, 숫자 한개는 합칠 수도 없고, 비용도 들지 않음으로 왼쪽 위에서 시작하는 대각선에는 모두 0이 대입된다.

이후로는, 아래 그림과 같이 진행된다.

Crepe

구성하는 숫자들을 분할 한 후, 분할된 숫자들을 합치는데 드는 비용들의 최소값을 전체 숫자들의 합과 더해주면 된다.

대각선으로 탐색해야해서 코드로 구현하는데 어려움이 있었던 것 같다.


CODE

import sys
read=sys.stdin.readline

for _ in range(int(read())):
    n=int(read())
    num=list(map(int,read().split()))

    dp=list(list(0 for _ in range(n)) for _ in range(n))
    #if n=5
    for k in range(1,n):#k=1,2,3,4
        for i in range(n-k):#i=0,1,2,3,4 when k=1
            X,Y=i,i+k
            dp[X][Y]=2147000000
            for j in range(k):
                tmp=dp[X+1+j][Y]+dp[X][Y-k+j]
                dp[X][Y]=min(dp[X][Y],tmp)
            dp[X][Y]+=sum(num[X:Y+1])
    print(dp[0][-1])


[다시 풀어보기]