알고리즘

백준 1890번 점프 (JAVA)

박카스마시며코딩 2023. 12. 30. 23:21

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

 

1890번: 점프

첫째 줄에 게임 판의 크기 N (4 ≤ N ≤ 100)이 주어진다. 그 다음 N개 줄에는 각 칸에 적혀져 있는 수가 N개씩 주어진다. 칸에 적혀있는 수는 0보다 크거나 같고, 9보다 작거나 같은 정수이며, 가장

www.acmicpc.net

 

저는 DP를 이용하여 문제를 풀었습니다.

DP를 이용해 이전에 계산한 것을 다시 계산하지 않도록하여 제한시간안에 풀었습니다.

 

package BOJ.dp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ_1890 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[][] map = new int[n][n];
        long[][] dp = new long[n][n];
        for(int i = 0 ; i < n ; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j = 0 ; j < n ; j++){
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        dp[0][0] = 1;
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < n ; j++){
                int length = map[i][j];
                if(length == 0){
                    continue;
                }
                if(i + length < n){
                    dp[i + length][j] += dp[i][j];
                }
                if(j + length < n ){
                    dp[i][j+length] += dp[i][j];
                }
            }
        }
        System.out.println(dp[n-1][n-1]);
    }



    private static final int[] DY = {1,0};
    private static final int[] DX = {0,1};
    private static final long INF = Long.MAX_VALUE;
    private static final int NOT_VALID = -1;
    private static long cal(int y, int x, int[][] map, int n,long[][] dp) {
        if(y == n-1 && x == n-1){
            return 1;
        }
        if(dp[y][x] != NOT_VALID){
            return dp[y][x];
        }
        long result = 0;
        for(int i = 0 ; i < 2; i++){
            int ny = y + map[y][x] * DY[i];
            int nx = x + map[y][x] * DX[i];
            if(ny < 0 || ny >= n || nx < 0 || nx >= n){
                continue;
            }
            result += cal(ny,nx,map,n,dp);
        }
        dp[y][x] = result;
        return result;
    }
}

'알고리즘' 카테고리의 다른 글

백준 16197번 두 동전 (JAVA)  (1) 2024.01.01
백준 19621번 회의실 배정 2 (JAVA)  (0) 2023.12.31
백준 1309번 동물원 (JAVA)  (0) 2023.12.29
백준 2169번 로봇 조종하기 (JAVA)  (0) 2023.12.28
백준 10773번 제로 (JAVA)  (1) 2023.12.27