Skip to content

Commit a73323e

Browse files
committed
Adding dynamic programming solution for unique paths problem
1 parent 35b1bcb commit a73323e

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <cassert>
4+
using namespace std;
5+
6+
int solveMem(int i, int j, int m, int n, vector<vector<int>> &dp) {
7+
if (i >= m || j >= n) return 0;
8+
if (i == m - 1 && j == n - 1) return 1;
9+
if (dp[i][j] != -1) return dp[i][j];
10+
dp[i][j] = solveMem(i + 1, j, m, n, dp) + solveMem(i, j + 1, m, n, dp);
11+
return dp[i][j];
12+
}
13+
14+
int solveTab(int m, int n) {
15+
vector<vector<int>> dp(m, vector<int>(n, 0));
16+
for (int i = 0; i < m; i++) dp[i][n - 1] = 1; // last column paths = 1
17+
for (int j = 0; j < n; j++) dp[m - 1][j] = 1; // last row paths = 1
18+
for (int i = m - 2; i >= 0; i--) {
19+
for (int j = n - 2; j >= 0; j--) {
20+
dp[i][j] = dp[i + 1][j] + dp[i][j + 1]; // paths from right + down
21+
}
22+
}
23+
return dp[0][0];
24+
}
25+
26+
int uniquePaths(int m, int n) {
27+
vector<vector<int>> dp(m + 1, vector<int>(n + 1, -1));
28+
// return solveMem(0, 0, m, n, dp);
29+
return solveTab(m, n);
30+
}
31+
32+
static void test() {
33+
assert(uniquePaths(3, 7) == 28);
34+
assert(uniquePaths(3, 2) == 3);
35+
assert(uniquePaths(1, 1) == 1);
36+
assert(uniquePaths(2, 2) == 2);
37+
cout << "All tests have successfully passed!\n";
38+
}
39+
40+
int main() {
41+
test(); // run self-tests
42+
return 0;
43+
}

0 commit comments

Comments
 (0)