Algorithm/백준
[백준][11048] 이동하기
1일1코딩
2020. 3. 22. 22:57
https://www.acmicpc.net/problem/11048
11048번: 이동하기
준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다. 준규는 현재 (1, 1)에 있고, (N, M)으로 이동하려고 한다. 준규가 (r, c)에 있으면, (r+1, c), (r, c+1), (r+1, c+1)로 이동할 수 있고, 각 방을 방문할 때마다 방에 놓여져있는 사탕을 모두 가져갈 수 있다. 또, 미로 밖으
www.acmicpc.net
풀이과정
1. dp로 접근했다.
2. dp[n][m]에는 최대 사탕 갯수가 들어간다.
3. dp[n][m] = max(dp[n-1][m] , dp[n][m -1]) 라는 식을 구하였다.
소스코드
더보기
#include <stdio.h>
#include <string.h>
int map[1001][1001];
int dp[1001][1001];
int N, M;
int solution(int y, int x)
{
if (dp[y][x] != -1) {
return dp[y][x];
}
if (y - 1 >= 0) {
dp[y][x] = solution(y - 1, x);
}
if (x - 1 >= 0) {
int tmp = solution(y, x - 1);
if (tmp > dp[y][x]) {
dp[y][x] = tmp;
}
}
dp[y][x] += +map[y][x];
return dp[y][x];
}
int main()
{
scanf("%d %d", &N, &M);
memset(dp, -1, sizeof(dp));
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%d", &map[i][j]);
}
}
dp[0][0] = map[0][0];
printf("%d\n", solution(N, M));
}