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]);
}
}