https://www.acmicpc.net/problem/14494
코드설명
동적계획법(Dynamic Programming, DP) 를 활용합니다.
문제에서 유의해야할점입니다.
첫번째는, 중간 계산 과정에서의 오버플로우가 발생합니다. MOD 연산을 매 단계마다 수행하더라도, 덧셈을 수행하기 전의 중간 결과가 int의 범위를 초과할 수 있습니다.
이 문제의 경우 아래와 같이 3개의 함수로 이루어져있기에 최대 10억씩 3개가 더해지면 중간과정에서 오버플로우가 발생합니다. 만약 두개만 더해졌다면 최대 20억이므로 오버플로우가 발생하지 않습니다.
ret += ( func(r, c + 1) % MOD + func(r + 1, c)% MOD + func(r + 1, c + 1) % MOD ) % MOD;
그러므로 long 자료형을 사용합니다.
코드
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
private static int N, T, K, M, L;
private static int[] arr;
private static int answer = 0;
private static long[][] cache = new long[1001][1001];
private static PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<1001;i++) {
Arrays.fill(cache[i], -1);
}
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
System.out.println(func(1, 1));
}
private static final int MOD = 1000000007;
private static long func(int r, int c) {
if(r == N && c == M) return 1;
if(r > N || c > M) return 0;
if(cache[r][c] != -1) return cache[r][c];
long ret = 0;
ret += ( func(r, c + 1) % MOD + func(r + 1, c)% MOD + func(r + 1, c + 1) % MOD ) % MOD;
return cache[r][c] = ret;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 15975 화살표 그리기 - 정렬(Sort) JAVA (0) | 2024.08.03 |
---|---|
[백준] 14501 퇴사 - 동적계획법(Dynamic Programming, DP) JAVA (0) | 2024.08.03 |
[백준] 14235 크리스마스 선물 - 우선순위큐(PriorityQueue, Collections.reverseOrder()) JAVA (0) | 2024.08.02 |
[백준] 13417 카드 문자열 - 그리디(Greedy, 탐욕법) JAVA (0) | 2024.08.02 |
[백준] 12847 꿀 아르바이트 - 슬라이딩 윈도우(Sliding Window) + 자료형(Data Type) JAVA (0) | 2024.08.01 |