'Coding has over 700 languages', '67% of programming jobs aren’t in the
technology industry', 'Coding is behind almost everything that is powered
by electricity'

Problem of the day

Last Updated: 30 Jul, 2020

Moderate

```
Down: (row+1,col)
Right: (row, col+1)
Down right diagonal: (row+1, col+1)
```

```
The first line will contain two integers ‘N’ and ‘M’ denoting the number of rows and columns, respectively.
Next ‘N’ lines contain ‘M’ space-separated integers each denoting the elements in the matrix.
The last line will contain two integers ‘x’ and ‘y’ denoting the cell to start from.
```

```
For each test case, print an integer that represents the minimum sum that can be obtained by traveling a path as described above.
Output for every test case will be printed in a separate line.
```

```
You don’t need to print anything; It has already been taken care of.
```

```
1 <= T <= 50
1 <= N, M <= 100
-10000 <= cost[i][j] <= 10000
1 <= x, y <= 100
Time limit: 1 sec
```

Let’s start from cell (X,Y). There are 3 possible cells from which we can come to (X,Y) (assuming they don’t violate the bounds of the array): cells (X-1, Y), (X, Y-1) and (X-1, Y-1). Now we find the minimum cost to reach these three cells. Here, we observe that this problem exhibits optimal substructure, i.e. this problem can be divided into smaller subproblems that do not overlap.

Create a recursive function minCost(int X, int Y), that computes the minimum cost it takes to reach cell (X,Y) from (1,1). The base case would be for cell (1,1) itself.

If you draw the recursion tree of all the function calls, you notice that the results of some cells get computed repeatedly. Instead of recomputing it, again and again, we instead store it in a 2D array, so that whenever we require the results later, we can just obtain them from this array. This saves a lot of time.

For each cell, let’s compute the answer in a top-down fashion, starting from the top leftmost cells. We create a ‘dp’ table of dimensions X*Y to store these results.

As we compute the results for the top leftmost cells first, when we come to cell (i, j), we already have the results for cells (i-1, j), (i, j-1) and (i-1, j-1) stored in the dp table (provided they do not violate the matrix boundaries). This allows us to compute results for the current cell in O(1) time.