강의

[고급-6] 동적 테이블의 응용1

Mosu(정종인) 2016. 12. 19. 00:06
반응형

학습목표 : 

주어진 문제를 동적테이블을 활용하여 해결할 수 있다.

재귀함수와 반복문으로 동적테이블을 적용할 수 있다.


1. 동적테이블의 응용1


(1) 광석수집

맵이 주어졌을 때, 왼쪽 맨 위의 SCV가 오른쪽 맨 아래의 도착점까지 아래로, 혹은 오른쪽으로만 이동해서 최대의 광석을 구해야 한다.


<방법 1> 전체탐색.

모든 경로를 탐색한다. 무조건 정답을 찾을 수 있지만 비효율적.

<방법 2> 동적테이블 이용

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
#include <stdio.h>
 
int n, m, A[210][210], DT[210][210];
 
int max(int a, int b){
    return a>b? a : b;
}
 
int solve(int a, int b){
    if(DT[a][b] == 0){ // DT[a][b]인 경우가 처음일때는 계산하고,
        if(a==n&&b==m)
            DT[a][b]=A[a][b];
        else if(a>|| b>m)
            DT[a][b]=0;
        else
            DT[a][b]=max(solve(a+1, b), solve(a, b+1))+A[a][b];
    }
    return DT[a][b]; //아니라면 DT[a][b]를 불러옵니다.
}
 
int main(){
    int i, j;
    scanf("%d%d"&n, &m);
    for(i=1; i<=n; ++i){
        for(j=1; j<=m; ++j){
            scanf("%d"&A[i][j]);
        }
    }
    printf("%d\n", solve(11));
    return 0;
}
cs



반응형