[백준 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 |