Skip to content

Commit a952c77

Browse files
committed
minimum path sum DP
1 parent ea05ef1 commit a952c77

File tree

1 file changed

+122
-0
lines changed

1 file changed

+122
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/*https://leetcode.com/problems/minimum-falling-path-sum/submissions/
2+
*
3+
*/
4+
// minimum hai bhai
5+
private class recursion {
6+
7+
public int minFallingPathSum(int[][] matrix) {
8+
int n = matrix.length;
9+
int m = matrix[0].length;
10+
11+
int ans = Integer.MAX_VALUE;
12+
13+
for (int j = 0; j < m; j++) {
14+
ans = Math.min(ans, recur(n - 1, j, matrix));
15+
}
16+
return ans;
17+
}
18+
19+
private int recur(int i, int j, int[][] matrix) {
20+
// out of bound errors
21+
if (j < 0 || j >= matrix[0].length) return Integer.MAX_VALUE;
22+
// if reawched the first row, then only
23+
if (i == 0) return matrix[0][j];
24+
25+
int up = recur(i - 1, j, matrix);
26+
int leftdiagonal = recur(i - 1, j - 1, matrix);
27+
int rightdiagonal = recur(i - 1, j + 1, matrix);
28+
return matrix[i][j] + Math.min(up, Math.min(leftdiagonal, rightdiagonal));
29+
}
30+
}
31+
32+
private class memoisation {
33+
int dp[][];
34+
35+
public int minFallingPathSum(int[][] matrix) {
36+
int n = matrix.length;
37+
int m = matrix[0].length;
38+
dp = new int[n][m];
39+
int ans = Integer.MAX_VALUE;
40+
// fill dp with min value
41+
for (int a[] : dp) {
42+
Arrays.fill(a, Integer.MAX_VALUE);
43+
}
44+
45+
for (int j = 0; j < m; j++) {
46+
ans = Math.min(ans, recur(n - 1, j, matrix));
47+
}
48+
return ans;
49+
}
50+
51+
private int recur(int i, int j, int[][] matrix) {
52+
// out of bound errors
53+
if (j < 0 || j >= matrix[0].length) return Integer.MAX_VALUE;
54+
// if reawched the first row, then only
55+
if (i == 0) return matrix[0][j];
56+
if (dp[i][j] != Integer.MAX_VALUE) return dp[i][j];
57+
58+
int up = recur(i - 1, j, matrix);
59+
int leftdiagonal = recur(i - 1, j - 1, matrix);
60+
int rightdiagonal = recur(i - 1, j + 1, matrix);
61+
return (
62+
dp[i][j] =
63+
matrix[i][j] + Math.min(up, Math.min(leftdiagonal, rightdiagonal))
64+
);
65+
}
66+
}
67+
68+
private class tabulation {
69+
int dp[][];
70+
71+
public int minFallingPathSum(int[][] matrix) {
72+
int n = matrix.length;
73+
int m = matrix[0].length;
74+
dp = new int[n][m];
75+
int ans = Integer.MAX_VALUE;
76+
// fill dp with min value
77+
for (int a[] : dp) {
78+
Arrays.fill(a, Integer.MAX_VALUE);
79+
}
80+
81+
// filling the first array
82+
for (int i = 0; i < m; i++) {
83+
dp[0][i] = matrix[0][i];
84+
}
85+
86+
for (int i = 1; i < n; i++) {
87+
for (int col = 0; col < m; col++) {
88+
// check out of boound and go
89+
dp[i][col] = matrix[i][col];
90+
91+
int up = dp[i - 1][col];
92+
int leftdiag = dp[i - 1][Math.max(0, col - 1)];
93+
int rightdiag = dp[i - 1][Math.min(m - 1, col + 1)];
94+
95+
// minimum from the rest of moves
96+
dp[i][col] += Math.min(up, Math.min(leftdiag, rightdiag));
97+
}
98+
}
99+
100+
// return the minimum value from the end
101+
for (int j = 0; j < m; j++) {
102+
ans = Math.min(ans, dp[n - 1][j]);
103+
}
104+
return ans;
105+
}
106+
107+
private int recur(int i, int j, int[][] matrix) {
108+
// out of bound errors
109+
if (j < 0 || j >= matrix[0].length) return Integer.MAX_VALUE;
110+
// if reawched the first row, then only
111+
if (i == 0) return matrix[0][j];
112+
if (dp[i][j] != Integer.MAX_VALUE) return dp[i][j];
113+
114+
int up = recur(i - 1, j, matrix);
115+
int leftdiagonal = recur(i - 1, j - 1, matrix);
116+
int rightdiagonal = recur(i - 1, j + 1, matrix);
117+
return (
118+
dp[i][j] =
119+
matrix[i][j] + Math.min(up, Math.min(leftdiagonal, rightdiagonal))
120+
);
121+
}
122+
}

0 commit comments

Comments
 (0)