[백준 11048번] 이동하기

2017. 6. 15. 00:50알고리즘/백준

반응형




풀이


조건은 딱 세가지 경우이다.

1. 오른쪽으로 한칸

2. 아래로 한칸

3. 대각선 남동쪽으로 한칸


이 세가지 경우중 합이 가장 큰값을 찾아서 DP방식으로 풀어내면 가능하다.


재귀로 푸려고 했지만 2차원 배열에서 재귀로 풀면 시간초과가 나는 경우가 많아 DP로 시도했다.








소스코드


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
#include <iostream>
using namespace std;
 
int n, m, map[1001][1001];
int tmp_arr[2][1001];
 
int Max(int a, int b) {
    return a > b ? a : b;
}
 
int main() {
    cin >> n >> m;
    for (int i = 0; i < n; i++) {  // i -> 세로
        for (int j = 0; j < m; j++) {  // j -> 가로
            cin >> map[i][j];
        }
    }
    for (int a = 0; a < n; a++) {
        // 복사
        for (int b = 0; b < m; b++) {
            tmp_arr[0][b] = map[a - 1][b]; // 이전칸
            tmp_arr[1][b] = map[a][b];  // 현재칸
        }
        //첫줄만 누적값
        if (a<1) {
            for (int b = 0; b < m; b++) {
                tmp_arr[0][b] += tmp_arr[0][b - 1];
            }
        }
        // 위랑 아래 비교
        tmp_arr[1][0= tmp_arr[0][0+ tmp_arr[1][0]; // 첫번째칸은 위에꺼 + 현재칸
        for (int b = 1; b < m; b++) {
            int tmp = Max(tmp_arr[0][b]+tmp_arr[1][b], tmp_arr[1][b-1]+tmp_arr[1][b]);
            tmp_arr[1][b] = Max(tmp, tmp_arr[1][b] + tmp_arr[0][b - 1]);
        }
        // 대입
        for (int b = 0; b < m; b++) {
            map[a][b] = tmp_arr[1][b];
        }
    }
 
    cout << map[n - 1][m - 1<< '\n';
    return 0;
}
cs











반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 11057번] 오르막 수  (0) 2017.06.16
[백준 1212번] 8진수 2진수  (0) 2017.06.15
[백준 11052번] 붕어빵 판매하기  (0) 2017.06.14
[백준 11727번] 2xn 타일링 2  (0) 2017.06.13
[백준 10972번] 다음 순열  (0) 2017.06.09