문제 설명
1. (1,1) 에서 시작 오른쪽, 밑, 대각선 이동 가능
2. 대각선으로 가는 경우는 오른쪽 또는 밑을 거쳐서 가는것보다 학상 작거나 같다. (음수가없음)
풀이
1. M 길이의 줄이 N 개 있다고 생각하고 풀었다. (최단거리를 찾는 문제랑 같음(도로에서 갈림길))
2. 오른쪽으로 가는 최대값은 항상 최대니 밑으로 내려가는 경우를 구해야됐다.
3. 밑으로 가는 경우에서 최대값은 왼쪽에서 오거나 바로 위에서 오는 경우이다.
4. 그래서 max(dp 배열의 현재 위치, dp 배열의 현재 위치에서의 왼쪽) 을 구해주면 된다.
증명
1. dp[1] 은 항상 최대값이다. (아래로 가는 경우만 존재)
2. dp[i] 에는 왼쪽 혹은 위에서 내려온 경우가 최대값이 된다.
첫 번째 줄만 생각해보자
dp[2] 를 구해야 하는 경우 왼쪽에서 오는 경우면 항상 최대값이다.
두 번째 줄을 생각해보면,
dp[1] 은 이전의 dp[1] 이 최대값이다. 그러면 dp[2] 도 최대값이 들어가게 된다. (dp[1] 을 구하는 방식이랑 똑같이 하게되면)
코드
문제
준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다.
준규는 현재 (1, 1)에 있고, (N, M)으로 이동하려고 한다. 준규가 (r, c)에 있으면, (r+1, c), (r, c+1), (r+1, c+1)로 이동할 수 있고, 각 방을 방문할 때마다 방에 놓여져있는 사탕을 모두 가져갈 수 있다. 또, 미로 밖으로 나갈 수는 없다.
준규가 (N, M)으로 이동할 때, 가져올 수 있는 사탕 개수의 최대값을 구하시오.
출력
첫째 줄에 준규가 (N, M)으로 이동할 때, 가져올 수 있는 사탕 개수를 출력한다.