[Leetcode] 64.Minimum Path Sum - C++

DP

Posted by dongjune on January 19, 2021

문제

64.Minimum Path Sum

풀이

DP와 Top-down 방식의 재귀함수를 활용하여 풀어줬습니다. 다음은 재귀함수 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
int getMin(vector<vector<int>>& grid, int y, int x){
    // 기저 사례
    if(y==0 && x==0) return grid[0][0];
    if(y<0 || x<0) return 987654321;
    
    // Memoization
    int &ret = cache[y][x];
    if(ret!=-1) return cache[y][x];
    
    return cache[y][x] = grid[y][x] + min(getMin(grid,y-1,x), getMin(grid,y,x-1));
}

cache 배열에 memoization을 수행해줍니다. cache 에 값이 할당 된 적 있다면 바로 cache 값을 return 해줍니다.
아니라면 현재 위치의 grid 값에 위의 cache값과 왼쪽의 cache 값의 최소 값을 더해주며 갱신해줍니다.

1
2
3
4
5
// Memoization
int &ret = cache[y][x];
if(ret!=-1) return cache[y][x];

return cache[y][x] = grid[y][x] + min(getMin(grid,y-1,x), getMin(grid,y,x-1));

코드 효율도 꽤 괜찮은 성능을 보입니다. 스크린샷 2021-01-19 오후 10 14 06

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
    int cache[200][200];
    
    int getMin(vector<vector<int>>& grid, int y, int x){
        // 기저 사례
        if(y==0 && x==0) return grid[0][0];
        if(y<0 || x<0) return 987654321;
        
        // Memoization
        int &ret = cache[y][x];
        if(ret!=-1) return cache[y][x];
        
        return cache[y][x] = grid[y][x] + min(getMin(grid,y-1,x), getMin(grid,y,x-1));
        
    }
    
    int minPathSum(vector<vector<int>>& grid) {
        int n = grid.size()-1, m = grid[0].size()-1;
        memset(cache, -1, sizeof(cache));
        return getMin(grid,n,m);
    }
};