다이나믹 프로그래밍 문제
가중치는 같지만 사탕을 가져올 수 있는 최대값을 문제이기 때문에 BFS로 풀 수 없다.
다양한 점화식이 있지만 가장 간단한 방법을 사용했다.
D[i][j]가 i,j에 도착했을때 가진 사탕의 최대값, map[i][j]가 i,j에 놓인 사탕의 개수라 가정했을 때,
위에서 왔을 경우 : D[i][j] = D[i-1][j] + map[i][j]
왼쪽에서 왔을 경우 : D[i][j] = D[i][j-1] + map[i][j]
왼쪽 위 대각선에서 왔을 경우 : D[i][j] = D[i-1][j-1] + map[i][j]
이기 떄문에
D[i][j]는 max(D[i-1][j], D[i][j-1], D[i-1][j-1]) + map[i][j]이 된다.
문제의 조건인 (1,1)에서 시작하여 (n,m)으로 도착하는 문제이기 떄문에
i-1이나 j-1의 범위 검사를 해주지 않아도 된다 (map이 0으로 초기화 되었기 떄문)
코드
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 | #include<stdio.h> #include<iostream> #include<vector> #include<queue> #include<algorithm> using namespace std; int map[1001][1001]; int d[1001][1001]; int main() { freopen("Text.txt", "r", stdin); int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> map[i][j]; } } d[1][1] = map[1][1]; d[2][1] = map[1][1] + map[2][1]; d[1][2] = map[1][1] + map[1][2]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { d[i][j] = max(max(d[i - 1][j], d[i][j - 1]), d[i - 1][j - 1]) + map[i][j]; } } cout << d[n][m] << endl; } | cs |
'BOJ' 카테고리의 다른 글
백준 10942 / 팰린드롬? (0) | 2019.02.09 |
---|---|
백준 1890 / 점프 (0) | 2019.02.08 |
백준 15558 / 점프 게임 (0) | 2019.02.07 |
백준 6087 / 레이저 통신 (0) | 2019.02.07 |
백준 4991 / 로봇 청소기 (0) | 2019.02.06 |