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 |