Java/코딩테스트

백준 11048 - Java

Bubbles 2023. 6. 29. 13:58

https://www.acmicpc.net/problem/11048

 

11048번: 이동하기

준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다. 준규는

www.acmicpc.net

 

쉬운 동적계획법 문제

이동 가능한 방향이 오른쪽, 아래쪽, 대각선 오른아래. 

그러므로 각 칸의 최대 사탕개수는 자신의 왼쪽, 위쪽, 대각선 왼쪽 위 중의 최댓값 + 그 칸에서 얻을 수 있는 사탕개수가 된다. 

이 점화식을 바탕으로 풀어나가면 되는 문제. 

import java.io.*;
import java.util.*;
public class p11048 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int row = Integer.parseInt(st.nextToken());
        int column = Integer.parseInt(st.nextToken());

        int[][] info = new int[row][column];
        int[][] DP = new int[row][column];

        for (int i = 0; i < row; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < column; j++) {
                info[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        DP[0][0] = info[0][0];
        for (int i = 1; i < row; i++) {
            DP[i][0] = DP[i-1][0] + info[i][0];
        }
        for (int j = 1; j < column; j++) {
            DP[0][j] = DP[0][j-1] + info[0][j];
        }

        for (int i = 1; i < row; i++) {
            for (int j = 1; j < column; j++) {
                int max = Math.max(DP[i-1][j], DP[i][j-1]);
                max = Math.max (DP[i-1][j-1], max);
                DP[i][j] = Math.max(info[i][j] + max, DP[i][j]);
            }
        }

        System.out.println(DP[row-1][column-1]);
    }
}