https://www.acmicpc.net/problem/11066
11066번: 파일 합치기
소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본
www.acmicpc.net
DP는 풀어도 적응이 안되고, 난이도가 높아지면 높아질수록 적용방법을 모르겠다
이 문제를 풀 때,
- 순서에 따라 계산을 하면 결과가 달라지기 때문에 조합을 이용해야 할 것 같다
- 조합되는 개수가 홀수, 짝수에 의해 달라지는 최솟값을 도출해야 할 것 같다
- 연속되는( 3 다음에 3과 같은 연속 ) 숫자를 기반으로 찾아 최솟값을 추론할 수 있을 것 같다
라고 생각했다.
결론적으로는 1번 조합을 추론한 것 제외한 나머지들은 유용하지 않은 생각이었다.
그러면 나는 이 문제들을 다음에 적용할 수 있게 이 문제를 어떻게 바라봐야 할까?
- 이 문제가 조합임을 이해하고, DP에 각 조합들의 합계를 저장할 수 있을 것 같다
- 조합되는 개수가 홀수, 짝수 와는 별개로 조합의 순서에 따른 계산값을 DP에 녹여낼 수 있어야 할 것 같다
음.. 다음에 이런 비슷한 문제를 보더라도 또 헤맬 것 같다..
N = int(input())
for _ in range(N):
total = int(input())
num_list = [0] + list(map(int,input().split() ))
prefix_sum = [0]
for i in range(1,len(num_list)):
prefix_sum.append( prefix_sum[-1] + num_list[i])
dp = [ [0] * len(num_list) for _ in range(len(num_list)) ]
for length in range(2, total+1):
for start in range( 1, total-length+2):
end = start + length - 1
dp[start][end] = min( [ dp[start][mid] + dp[mid+1][end] for mid in range(start,end)] ) + prefix_sum[end] - prefix_sum[start-1]
print(dp[1][-1])
'알고리즘 > Problem Solving' 카테고리의 다른 글
[BOJ] 11049. 행렬 곱셈 순서 (python, DP, 그림풀이) (0) | 2023.10.03 |
---|