내용으로 건너뛰기
테페리넷
사용자 도구
등록
로그인
사이트 도구
검색
도구
문서 보기
Fold/unfold all
역링크
미디어 관리자
사이트맵
등록
로그인
>
미디어 관리자
사이트맵
현재 위치:
테페리넷
»
Problem Solving
»
문제
»
백준 온라인 저지 (BOJ)
»
파일 합치기
ps:problems:boj:11066
이 문서는 읽기 전용입니다. 원본을 볼 수는 있지만 바꿀 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하세요.
====== 파일 합치기 ====== ===== 풀이 ===== * [[ps:구간_분할_방식에_관한_dp#최적 이진 검색 트리]] 문제이다. 자세한 내용은 링크 참조. * 링크에서 설명했듯이, O(n^3) 풀이를 의도한 문제이지만, 그렇게 풀어서는 Python으로는 통과가 힘들다. 여기에서는 [[ps:구간_분할_방식에_관한_dp#크누스 최적화]]를 적용하여 O(n^2)에 풀었다. * Garsia–Wachs algorithm 을 이용하면 O(nlogn)에도 해결이 가능하고, O(n^2)으로 구현해도 이 방식보다 빠르다. Garsia–Wachs algorithm의 O(n^2)의 구현은 [[ps:problems:boj:13974|파일 합치기 2]] 를 참조 ===== 코드 ===== <dkpr py> """Solution code for "BOJ 11066. 파일 합치기". - Problem link: https://www.acmicpc.net/problem/11066 - Solution link: http://www.teferi.net/ps/problems/boj/11066 """ def main(): T = int(input()) for _ in range(T): K = int(input()) file_sizes = [int(x) for x in input().split()] v = 0 prefix_sum = [v] + [v := v + x for x in file_sizes] dp = [[0] * K for _ in range(K + 1)] opt = list(range(K)) for l in range(1, K): for i in range(K - l): j = i + l dp[i][j], opt[i] = min((dp[i][k] + dp[k + 1][j], k) for k in range(opt[i], opt[i + 1] + 1)) dp[i][j] += prefix_sum[j + 1] - prefix_sum[i] print(dp[0][K - 1]) if __name__ == '__main__': main() </dkpr> {{tag>BOJ ps:problems:boj:골드_3}}
ps/problems/boj/11066.txt
· 마지막으로 수정됨: 2021/03/08 15:47 저자
teferi
문서 도구
문서 보기
역링크
Fold/unfold all
맨 위로