본문 바로가기
알고리즘/문제 풀이

백준 11048번 이동하기

by _eunji_ 2020. 1. 11.

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

 

  • 풀이

준규의 이동 경로는 오른쪽, 아래, 오른쪽 아래 대각선으로 총 세 가지이다.

오른쪽 아래 대각선오른쪽, 아래아래, 오른쪽으로 이동할 수 있어 값이 작거나 같기 때문에 고려하지 않아도 된다.

 

예제를 표로 그려보면 다음과 같다.

왼쪽은 그래프, 오른쪽은 dp그래프를 표현한 표이다.

dp [N][M]은 현재의 위치(N, M)에 도달하기까지 최대 값을 의미한다.

예를 들어, DP[2][3]의 값(18)은 graph [2][3] 값(8)에 DP [2][3] 기준으로 왼쪽 값(10)과 위쪽 값(3) 중 최댓값(10)을 더하면 된다.

즉, dp[N][M] = graph [N][M] + Math.max(Math.max(dp [N-1][M], dp [N][M-1]))이다.

 

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Vector;

public class Main {
	public static void main(String[] args) {
		int max=0;
		
		Scanner s = new Scanner(System.in);
		
		//System.out.println("미로의 크기를 입력하시오: ");
		int N = s.nextInt();
		int M = s.nextInt();
		
		
		int graph[][] = new int[N+1][M+1];
		int dp[][] = new int[N+1][M+1];
		
		for(int i=1;i<=N;i++) {
			for(int j=1;j<=M;j++) {
				graph[i][j] = s.nextInt();
			}
		}
		
		for(int i=1;i<=N;i++) {
			for(int j=1;j<=M;j++) {
				dp[i][j]=graph[i][j]+Math.max(dp[i-1][j],dp[i][j-1]);
			}
		}

		System.out.println(dp[N][M]);
	}
}

댓글