https://leetcode.com/problems/unique-paths/description/

코드설명

동적계획법(DP, Dynamic Programming) 을 활용합니다.

 

기저사례로 먼저

DP 테이블의 최상단 Row와 최좌측 Col들을 모두 1개의 방법으로 밖에 도달하지 못한다는 의미로 1로 초기화시킵니다.

DP[i][j]가 의미하는 바는, (1, 1) 에서 (i, j)까지 갈 수 있는 경로를 의미합니다.

점화식을 세우면

DP[r][[c] = DP[r-1][ + DP[r][c-1] 입니다. (조건은 r == 1일떄와 c == 1 일때는 1입니다. )

코드

정답코드1입니다.

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] DP = new int[m + 1][n + 1];
        Arrays.fill(DP[1], 1);
        for(int r=1; r<=m; r++){
            DP[r][1] = 1;
        }
        for(int r=1; r<=m; r++){
            for(int c=1; c<=n; c++){
                DP[r][c] = DP[r-1][c] + DP[r][c-1];
            }
        }
        return DP[m][n];
    }
}

정답코드2입니다.

class Solution {
    int[][] cache;
    public int uniquePaths(int m, int n) {
        cache = new int[102][102];
        for(int[] c : cache){
            Arrays.fill(c, -1);
        }
        return DFS(m, n, 1, 1);
    }

    int DFS(int m, int n, int r, int c){
        if(r == m && c == n){
            return 1;
        }
        if(cache[r][c] != -1) return cache[r][c];

        int ret = 0;
        for(int[] dir : new int[][] {{1, 0}, {0, 1}}){
            int nr = r + dir[0];
            int nc = c + dir[1];
            if(nr > m || nc > n) continue;
            ret += DFS(m, n, nr, nc);
        }
        return cache[r][c] = ret;
    }
}

+ Recent posts