티스토리 뷰

 

문제 링크 : https://www.acmicpc.net/problem/11066

 

11066번: 파일 합치기

소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본

www.acmicpc.net

 

비교적 쉬운 문제들부터 Top-Down 구현과  Bottom-Up 구현을 비교해 보고 있는데,

부족한 것이 한둘이 아니다.

 

이 문제에서는 두 구현에 같은 사고 방식을 적용하지 못했다.

따라서 시간 비교는 별 의미는 없지만 Top-Down 방식이 4 배 이상의 시간을 소요한다.

 

recur( a , b ) 함수는 구간 [ 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
링크
«   2025/06   »
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
글 보관함