diff --git a/DynamicProgramming/MinimumPathSum.java b/DynamicProgramming/MinimumPathSum.java
new file mode 100644
index 000000000000..cc0fcaa4ed98
--- /dev/null
+++ b/DynamicProgramming/MinimumPathSum.java
@@ -0,0 +1,81 @@
+package DynamicProgramming;
+
+/*
+Given the following grid with length m and width n:
+\---\---\---\ (n)
+\ 1 \ 3 \ 1 \
+\---\---\---\
+\ 1 \ 5 \ 1 \
+\---\---\---\
+\ 4 \ 2 \ 1 \
+\---\---\---\
+(m)
+Find the path where its sum is the smallest.
+
+All numbers given are positive.
+The Time Complexity of your algorithm should be smaller than or equal to O(mn).
+The Space Complexity of your algorithm should be smaller than or equal to O(mn).
+You can only move from the top left corner to the down right corner.
+You can only move one step down or right.
+
+EXAMPLE:
+INPUT: grid = [[1,3,1],[1,5,1],[4,2,1]]
+OUTPUT: 7
+EXPLANATIONS: 1 + 3 + 1 + 1 + 1 = 7
+
+For more information see https://www.geeksforgeeks.org/maximum-path-sum-matrix/
+*/
+public class MinimumPathSum {
+
+  public void testRegular() {
+    int[][] grid = {
+      {1, 3, 1},
+      {1, 5, 1},
+      {4, 2, 1}
+    };
+    System.out.println(minimumPathSum(grid));
+  }
+
+  public void testLessColumns() {
+    int[][] grid = {
+      {1, 2},
+      {5, 6},
+      {1, 1}
+    };
+    System.out.println(minimumPathSum(grid));
+  }
+
+  public void testLessRows() {
+    int[][] grid = {
+      {2, 3, 3},
+      {7, 2, 1}
+    };
+    System.out.println(minimumPathSum(grid));
+  }
+
+  public void testOneRowOneColumn() {
+    int[][] grid = {{2}};
+    System.out.println(minimumPathSum(grid));
+  }
+
+  public static int minimumPathSum(int[][] grid) {
+    int m = grid.length, n = grid[0].length;
+    if (n == 0) {
+      return 0;
+    }
+    int[][] dp = new int[m][n];
+    dp[0][0] = grid[0][0];
+    for (int i = 0; i < n - 1; i++) {
+      dp[0][i + 1] = dp[0][i] + grid[0][i + 1];
+    }
+    for (int i = 0; i < m - 1; i++) {
+      dp[i + 1][0] = dp[i][0] + grid[i + 1][0];
+    }
+    for (int i = 1; i < m; i++) {
+      for (int j = 1; j < n; j++) {
+        dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
+      }
+    }
+    return dp[m - 1][n - 1];
+  }
+}