반응형

문제 출처 :

https://www.acmicpc.net/problem/11066



알고리즘 분석 :


문제 해결에 필요한 사항

1. Dynamic Programming

2. 점화식 세우는 방법


3중 포문을 이용하여 문제를 해결 할 수 있다.


점화식은 다음과 같다.


dp[j][i] :: j~i번째까지 파일을 합칠 때 최소비용


3중포문은 다음과 같이 이용한다.


for (int i = 2; i <= n; i++)

{

for (int j = i - 1; j > 0; j--)

{

dp[j][i] = 987654321;

for (int k = j; k <= i; k++)

dp[j][i] = min(dp[j][i], dp[j][k] + dp[k + 1][i]);


dp[j][i] += pSum[i] - pSum[j - 1];

}

}




위의 코드가 위의 그림과 같은 역할을 하게 된다.


dp[j][i]의 최소비용을 찾기 위해서는 그 사이에 있는 모든 dp[j][k]와 dp[k+1][i] 사이의 최소를 찾으면 된다.




소스 코드 : 


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <memory.h>
 
using namespace std;
 
int dp[502][502];
int arr[502];
int pSum[502];
 
int main()
{
    int tc;
    scanf("%d"&tc);
 
    while (tc--)
    {
        memset(dp, 0sizeof(dp));
        memset(arr, 0sizeof(arr));
 
        int n;
        scanf("%d"&n);
 
        for (int i = 1; i <= n; i++)
        {
            scanf("%d"&arr[i]);
            pSum[i] = pSum[i - 1+ arr[i];
        }
 
        for (int i = 2; i <= n; i++)
        {
            for (int j = i - 1; j > 0; j--)
            {
                dp[j][i] = 987654321;
                for (int k = j; k <= i; k++)
                    dp[j][i] = min(dp[j][i], dp[j][k] + dp[k + 1][i]);
 
                dp[j][i] += pSum[i] - pSum[j - 1];
            }
        }
        printf("%d\n", dp[1][n]);
 
    }
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus

반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[1254번] 팰린드롬 만들기  (0) 2017.11.19
[14846번] 직사각형과 쿼리  (4) 2017.11.17
[11495번] 격자 0 만들기  (2) 2017.11.15
[1658번] 돼지 잡기  (2) 2017.11.14
[2866번] 문자열 잘라내기  (0) 2017.11.13