티스토리 뷰
문제 링크 : https://www.acmicpc.net/problem/11066
11066번: 파일 합치기
소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본
www.acmicpc.net
비교적 쉬운 문제들부터 Top-Down 구현과 Bottom-Up 구현을 비교해 보고 있는데,
부족한 것이 한둘이 아니다.
이 문제에서는 두 구현에 같은 사고 방식을 적용하지 못했다.
따라서 시간 비교는 별 의미는 없지만 Top-Down 방식이 4 배 이상의 시간을 소요한다.
recur( a , b ) 함수는 구간 [ a , b ] 에서 최적의 순서(최소 비용)로 결합한 비용을 돌려준다.
탑다운 방식이 코드 작성이 내게는 편하다.
기저 사례에 대한 처리만 선행되면 그 뒤는 알아서 잘 하겠거니 하면 된다.
#include<bits/stdc++.h>
using namespace std;
int n,arr[501];
int ss[501],dp[501][501];
int recur(int a, int b){
if(a==b) return 0;
int &ret=dp[a][b];
if(ret) return ret;
ret=INT_MAX;
for(int i=a;i<b;i++){
ret=min(ret, recur(a,i)+recur(i+1,b));
}
ret+=ss[b]-ss[a-1];
return ret;
}
void solve(){
memset(dp,0,sizeof dp);
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d", &arr[i]);
ss[i]=ss[i-1]+arr[i];
}
printf("%d\n",recur(1,n));
}
int main(){
int T; scanf("%d",&T);
while(T--){
solve();
}
}
바텀업 방식은 부분 문제를 길이 순으로 해결한다.
길이가 2 일 때를 해결하고 3, 4, ... 인 경우를 차례로 해결한다.
#include<bits/stdc++.h>
using namespace std;
int n,arr[501];
int ss[501],dp[501][501];
void solve(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&arr[i]);
ss[i]=ss[i-1]+arr[i];
}
for(int l=2;l<=n;l++){
for(int i=1;i<=n-l+1;i++){
int j=i+l-1;
dp[i][j]=INT_MAX;
for(int k=i;k<j;k++){
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
}
dp[i][j]+=ss[j]-ss[i-1];
}
}
printf("%d\n",dp[1][n]);
}
int main(){
int T; scanf("%d",&T);
while(T--){
solve();
}
}
반응형
'DS\Algo > Dynamic Programming' 카테고리의 다른 글
BOJ 10942 팰린드롬? (0) | 2022.09.17 |
---|---|
BOJ 1915 가장 큰 정사각형 (0) | 2022.09.15 |
BOJ 11048 이동하기 (0) | 2022.09.11 |
BOJ 11054 가장 긴 바이토닉 부분 수열 (0) | 2022.09.09 |
BOJ 11052 카드 구매하기 (0) | 2022.09.09 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- persistent segment tree
- 백준
- dynamic programming
- math font
- Vim
- Reference
- BOJ
- C++ big number
- fenwick tree
- map
- segment tree
- Dijkstra
- stack
- bash
- script
- 다익스트라
- shell
- RUBY
- python3
- nearest common ancestor
- 세그먼트 트리
- JavaScript
- lazy propagation
- bash script
- max flow
- Aho-Corasick
- javascript array
- Shell Programming
- number theory
- 정수론
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
글 보관함