ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 11048 이동하기
    백준/DP 다이나믹 프로그래밍 2022. 5. 17. 22:55

    1. 풀이

     

    문제 예시 1로 설명하겠다.

     

    3 4
    1 2 3 4
    0 0 0 5
    9 8 7 6

     

    map 배열에 각 위치의 사탕 개수를 입력한다.

     

    즉,

    1 2 3 4
    0 0 0 5
    9 8 7 6

     

    이 값들을 map 배열에 입력한다.

     

    문제에서 한 점은 1) 오른쪽, 2) 아래쪽, 3) 오른쪽 아래로 이동 가능하다고 했다.

    즉, (1,1) 위치에서 이동 가능한 곳은 아래 그림과 같다.

     

     

     

     

    그렇기 때문에 위치(2,2)에 있는 준규가 가질 수 있는 사탕 개수의 최댓값은 

    (2,2) 위치의 사탕 개수  + (1,1), (1,2), (2,1) 위치 사탕 개수 중 제일 큰 값이다.

     

    자세히 설명하자면,

    (1,1) 에서 오른쪽, 아래쪽, 오른쪽 아래 방향으로 이동 가능하다. 그런데 이것은 출발지 -> 도착지 방향이다.

    그렇다면 도착지에서 출발지를 바라보는 방향은 이와 반대로 왼쪽, 위쪽, 왼쪽 위 방향이 된다.

    그래서 (2,2) 로 오기 전의 위치는 (2,1), (1,2), (1,1) 이다.

     

     

    이를 이용해서 최대 사탕 개수를 구하려면 아래와 같은 식을 사용하면 된다.

     

    dp[i][j] = map[i][j] + Math.max(Math.max(dp[i-1][j-1], dp[i-1][j]) , dp[i][j-1])

     

     

     

     

    2. 최종 코드

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
    	
    	public static void main(String[] args) throws IOException {
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st = new StringTokenizer(br.readLine(), " " );
    		int N = Integer.parseInt(st.nextToken());
    		int M = Integer.parseInt(st.nextToken());
    	
    		int map[][] = new int[N+1][M+1];
    		int dp[][] = new int[N+1][M+1];
    		
    		for(int i= 1; i<=N; i++) {
    			st = new StringTokenizer(br.readLine(), " " );
    			for(int j=1; j<=M; j++) {
    				map[i][j] = Integer.parseInt(st.nextToken());
    			}
    		}
    		
    		
    		for(int i=1; i<=N; i++) {
    			for(int j =1; j<=M;j++ ) {
    				dp[i][j] = map[i][j] + Math.max(Math.max(dp[i-1][j-1], dp[i-1][j]) , dp[i][j-1]); 
    			}
    		}
    		
    		System.out.println(dp[N][M]);
    	}
    }

    '백준 > DP 다이나믹 프로그래밍' 카테고리의 다른 글

    10164 격자상의 경로  (0) 2022.05.22
    11060 점프 점프  (0) 2022.05.22
    가장 긴 증가하는 부분 수열 11053  (0) 2022.02.08
    11057 오르막 수  (0) 2021.10.26
    9465 스티커  (0) 2021.10.23

    댓글

Designed by Tistory.