Leetcode 64. 최소 경로 합계
간단한 DP 문제. 배열의 왼쪽 상단에서 오른쪽 하단으로 두 가지 옵션(오른쪽으로 이동 또는 아래로 이동)으로 달성할 수 있는 최소 가중치를 얻는 방법입니다. 그래프로 생각하면 왼쪽 상단부터 dijkstra를 사용하여 모든 노드를 파악해야 한다면 O(nlogn)입니다. 그러나이 문제에 대해 DP를 사용할 수 있습니다.
- dp(r)(c) = 가중치(r)(c) + (dp(r-1)(c), dp(r)(c-1))
// Runtime 7 ms Beats 90.29%
// Memory 9.5 MB Beats 98.74%
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(), n = grid(0).size();
for(int c = 1; c<n; c++){
grid(0)(c) += grid(0)(c-1);
}
for(int r = 1; r<m; r++){
grid(r)(0) += grid(r-1)(0);
}
for(int r = 1; r<m; r++){
for(int c = 1; c<n; c++){
grid(r)(c) += min(grid(r-1)(c), grid(r)(c-1));
}
}
return grid(m-1)(n-1);
}
};
시간적 복잡성
O(mn) 배열의 모든 요소가 DP 동안 한 번 검색되기 때문입니다.
공간적 복잡성
여분의 공간을 사용하지 않습니다. 문제 조건이 m x n 배열을 사용하기 때문에 O(mn)
