# Find the minimum cost to reach destination using a train

There are N stations on route of a train. The train goes from station 0 to N-1. The ticket cost for all pair of stations (i, j) is given where j is greater than i. Find the minimum cost to reach the destination.

Consider the following example:

Input: cost[N][N] = { {0, 15, 80, 90}, {INF, 0, 40, 50}, {INF, INF, 0, 70}, {INF, INF, INF, 0} }; There are 4 stations and cost[i][j] indicates cost to reach j from i. The entries where j < i are meaningless. Output: The minimum cost is 65 The minimum cost can be obtained by first going to station 1 from 0. Then from station 1 to station 3.

The minimum cost to reach N-1 from 0 can be recursively written as following:

minCost(0, N-1) = MIN { cost[0][n-1], cost[0][1] + minCost(1, N-1), minCost(0, 2) + minCost(2, N-1), ........, minCost(0, N-2) + cost[N-2][n-1] }

The following is the implementation of above recursive formula.

## C++

`// A naive recursive solution to find min cost path from station 0` `// to station N-1` `#include<iostream>` `#include<climits>` `using` `namespace` `std;` `// infinite value` `#define INF INT_MAX` `// Number of stations` `#define N 4` `// A C++ recursive function to find the shortest path from` `// source 's' to destination 'd'.` `int` `minCostRec(` `int` `cost[][N], ` `int` `s, ` `int` `d)` `{` ` ` `// If source is same as destination` ` ` `// or destination is next to source` ` ` `if` `(s == d || s+1 == d)` ` ` `return` `cost[s][d];` ` ` `// Initialize min cost as direct ticket from` ` ` `// source 's' to destination 'd'.` ` ` `int` `min = cost[s][d];` ` ` `// Try every intermediate vertex to find minimum` ` ` `for` `(` `int` `i = s+1; i<d; i++)` ` ` `{` ` ` `int` `c = minCostRec(cost, s, i) +` ` ` `minCostRec(cost, i, d);` ` ` `if` `(c < min)` ` ` `min = c;` ` ` `}` ` ` `return` `min;` `}` `// This function returns the smallest possible cost to` `// reach station N-1 from station 0. This function mainly` `// uses minCostRec().` `int` `minCost(` `int` `cost[][N])` `{` ` ` `return` `minCostRec(cost, 0, N-1);` `}` `// Driver program to test above function` `int` `main()` `{` ` ` `int` `cost[N][N] = { {0, 15, 80, 90},` ` ` `{INF, 0, 40, 50},` ` ` `{INF, INF, 0, 70},` ` ` `{INF, INF, INF, 0}` ` ` `};` ` ` `cout << ` `"The Minimum cost to reach station "` ` ` `<< N << ` `" is "` `<< minCost(cost);` ` ` `return` `0;` `}` |

## Java

`// A Java naive recursive solution to find min cost path from station 0` `// to station N-1` `class` `shortest_path` `{` ` ` `static` `int` `INF = Integer.MAX_VALUE,N = ` `4` `;` ` ` `// A recursive function to find the shortest path from` ` ` `// source 's' to destination 'd'.` ` ` `static` `int` `minCostRec(` `int` `cost[][], ` `int` `s, ` `int` `d)` ` ` `{` ` ` `// If source is same as destination` ` ` `// or destination is next to source` ` ` `if` `(s == d || s+` `1` `== d)` ` ` `return` `cost[s][d];` ` ` ` ` `// Initialize min cost as direct ticket from` ` ` `// source 's' to destination 'd'.` ` ` `int` `min = cost[s][d];` ` ` ` ` `// Try every intermediate vertex to find minimum` ` ` `for` `(` `int` `i = s+` `1` `; i<d; i++)` ` ` `{` ` ` `int` `c = minCostRec(cost, s, i) +` ` ` `minCostRec(cost, i, d);` ` ` `if` `(c < min)` ` ` `min = c;` ` ` `}` ` ` `return` `min;` ` ` `}` ` ` ` ` `// This function returns the smallest possible cost to` ` ` `// reach station N-1 from station 0. This function mainly` ` ` `// uses minCostRec().` ` ` `static` `int` `minCost(` `int` `cost[][])` ` ` `{` ` ` `return` `minCostRec(cost, ` `0` `, N-` `1` `);` ` ` `}` ` ` `public` `static` `void` `main(String args[])` ` ` `{` ` ` `int` `cost[][] = { {` `0` `, ` `15` `, ` `80` `, ` `90` `},` ` ` `{INF, ` `0` `, ` `40` `, ` `50` `},` ` ` `{INF, INF, ` `0` `, ` `70` `},` ` ` `{INF, INF, INF, ` `0` `}` ` ` `};` ` ` `System.out.println(` `"The Minimum cost to reach station "` `+ N+` ` ` `" is "` `+minCost(cost));` ` ` `}` `}` `/* This code is contributed by Rajat Mishra */` |

## Python

`# Python program to find min cost path` `# from station 0 to station N-1` `global` `N` `N ` `=` `4` `def` `minCostRec(cost, s, d):` ` ` `if` `s ` `=` `=` `d ` `or` `s` `+` `1` `=` `=` `d:` ` ` `return` `cost[s][d]` ` ` `min` `=` `cost[s][d]` ` ` `for` `i ` `in` `range` `(s` `+` `1` `, d):` ` ` `c ` `=` `minCostRec(cost,s, i) ` `+` `minCostRec(cost, i, d)` ` ` `if` `c < ` `min` `:` ` ` `min` `=` `c` ` ` `return` `min` `def` `minCost(cost):` ` ` `return` `minCostRec(cost, ` `0` `, N` `-` `1` `)` `cost ` `=` `[ [` `0` `, ` `15` `, ` `80` `, ` `90` `],` ` ` `[` `float` `(` `"inf"` `), ` `0` `, ` `40` `, ` `50` `],` ` ` `[` `float` `(` `"inf"` `), ` `float` `(` `"inf"` `), ` `0` `, ` `70` `],` ` ` `[` `float` `(` `"inf"` `), ` `float` `(` `"inf"` `), ` `float` `(` `"inf"` `), ` `0` `]` ` ` `]` `print` `"The Minimum cost to reach station %d is %d"` `%` `\` ` ` `(N, minCost(cost))` ` ` `# This code is contributed by Divyanshu Mehta` |

## C#

`// A C# naive recursive solution to find min` `// cost path from station 0 to station N-1` `using` `System;` `class` `GFG {` ` ` ` ` `static` `int` `INF = ` `int` `.MaxValue, N = 4;` ` ` ` ` `// A recursive function to find the` ` ` `// shortest path from source 's' to` ` ` `// destination 'd'.` ` ` `static` `int` `minCostRec(` `int` `[,]cost, ` `int` `s, ` `int` `d)` ` ` `{` ` ` ` ` `// If source is same as destination` ` ` `// or destination is next to source` ` ` `if` `(s == d || s + 1 == d)` ` ` `return` `cost[s,d];` ` ` ` ` `// Initialize min cost as direct` ` ` `// ticket from source 's' to` ` ` `// destination 'd'.` ` ` `int` `min = cost[s,d];` ` ` ` ` `// Try every intermediate vertex to` ` ` `// find minimum` ` ` `for` `(` `int` `i = s + 1; i < d; i++)` ` ` `{` ` ` `int` `c = minCostRec(cost, s, i) +` ` ` `minCostRec(cost, i, d);` ` ` ` ` `if` `(c < min)` ` ` `min = c;` ` ` `}` ` ` ` ` `return` `min;` ` ` `}` ` ` ` ` `// This function returns the smallest` ` ` `// possible cost to reach station N-1` ` ` `// from station 0. This function mainly` ` ` `// uses minCostRec().` ` ` `static` `int` `minCost(` `int` `[,]cost)` ` ` `{` ` ` `return` `minCostRec(cost, 0, N-1);` ` ` `}` ` ` `// Driver code` ` ` `public` `static` `void` `Main()` ` ` `{` ` ` `int` `[,]cost = { {0, 15, 80, 90},` ` ` `{INF, 0, 40, 50},` ` ` `{INF, INF, 0, 70},` ` ` `{INF, INF, INF, 0} };` ` ` `Console.WriteLine(` `"The Minimum cost to"` ` ` `+ ` `" reach station "` `+ N` ` ` `+ ` `" is "` `+minCost(cost));` ` ` `}` `}` `// This code is contributed by Sam007.` |

## PHP

`<?php` `// A PHP naive recursive solution to find min cost path from station 0` `// to station N-1` `// infinite value` `$INF` `= PHP_INT_MAX ;` `// Number of stations` ` ` `$N` `= 4;` `// A recursive function to find the shortest path from` `// source 's' to destination 'd'.` `function` `minCostRec(` `$cost` `, ` `$s` `, ` `$d` `)` `{` ` ` `// If source is same as destination` ` ` `// or destination is next to source` ` ` `if` `(` `$s` `== ` `$d` `|| ` `$s` `+1 == ` `$d` `)` ` ` `return` `$cost` `[` `$s` `][` `$d` `];` ` ` `// Initialize min cost as direct ticket from` ` ` `// source 's' to destination 'd'.` `$min` `= ` `$cost` `[` `$s` `][` `$d` `];` ` ` `// Try every intermediate vertex to find minimum` ` ` `for` `(` `$i` `= ` `$s` `+1; ` `$i` `<` `$d` `; ` `$i` `++)` ` ` `{` ` ` `$c` `= minCostRec(` `$cost` `, ` `$s` `, ` `$i` `) +` ` ` `minCostRec(` `$cost` `, ` `$i` `, ` `$d` `);` ` ` `if` `(` `$c` `< ` `$min` `)` ` ` `$min` `= ` `$c` `;` ` ` `}` ` ` `return` `$min` `;` `}` `// This function returns the smallest possible cost to` `// reach station N-1 from station 0. This function mainly` `// uses minCostRec().` `function` `minCost(` `$cost` `)` `{` ` ` `global` `$N` `;` ` ` `return` `minCostRec(` `$cost` `, 0, ` `$N` `-1);` `}` `// Driver program to test above function` ` ` `$cost` `= ` `array` `(` `array` `(0, 15, 80, 90),` ` ` `array` `(INF, 0, 40, 50),` ` ` `array` `(INF, INF, 0, 70),` ` ` `array` `(INF, INF, INF, 0)` ` ` `);` ` ` `echo` `"The Minimum cost to reach station "` `,` ` ` `$N` `, ` `" is "` `, minCost(` `$cost` `);` `?>` |

## Javascript

`<script>` ` ` `// A Javascript naive recursive solution to find min cost path from station 0 to station N-1 ` ` ` `let INF = Number.MAX_VALUE,N = 4;` ` ` ` ` `// A recursive function to find the shortest path from` ` ` `// source 's' to destination 'd'.` ` ` `function` `minCostRec(cost, s, d)` ` ` `{` ` ` ` ` `// If source is same as destination` ` ` `// or destination is next to source` ` ` `if` `(s == d || s+1 == d)` ` ` `return` `cost[s][d];` ` ` ` ` `// Initialize min cost as direct ticket from` ` ` `// source 's' to destination 'd'.` ` ` `let min = cost[s][d];` ` ` ` ` `// Try every intermediate vertex to find minimum` ` ` `for` `(let i = s+1; i<d; i++)` ` ` `{` ` ` `let c = minCostRec(cost, s, i) +` ` ` `minCostRec(cost, i, d);` ` ` `if` `(c < min)` ` ` `min = c;` ` ` `}` ` ` `return` `min;` ` ` `}` ` ` ` ` `// This function returns the smallest possible cost to` ` ` `// reach station N-1 from station 0. This function mainly` ` ` `// uses minCostRec().` ` ` `function` `minCost(cost)` ` ` `{` ` ` `return` `minCostRec(cost, 0, N-1);` ` ` `}` ` ` ` ` `let cost = [ [0, 15, 80, 90],` ` ` `[INF, 0, 40, 50],` ` ` `[INF, INF, 0, 70],` ` ` `[INF, INF, INF, 0]` ` ` `];` ` ` `document.write(` `"The Minimum cost to reach station "` `+ N+` ` ` `" is "` `+minCost(cost));` `// This code is contributed by decode2207.` `</script>` |

**Output:**

The Minimum cost to reach station 4 is 65

Time complexity of the above implementation is exponential as it tries every possible path from 0 to N-1. The above solution solves same subrpoblems multiple times (it can be seen by drawing recursion tree for minCostPathRec(0, 5).

Since this problem has both properties of dynamic programming problems ((see this and this). Like other typical Dynamic Programming(DP) problems, re-computations of same subproblems can be avoided by storing the solutions to subproblems and solving problems in bottom up manner.

One dynamic programming solution is to create a 2D table and fill the table using above given recursive formula. The extra space required in this solution would be O(N^{2}) and time complexity would be O(N^{3})

We can solve this problem using O(N) extra space and O(N^{2}) time. The idea is based on the fact that given input matrix is a Directed Acyclic Graph (DAG). The shortest path in DAG can be calculated using the approach discussed in below post.

Shortest Path in Directed Acyclic Graph

We need to do less work here compared to above mentioned post as we know topological sorting of the graph. The topological sorting of vertices here is 0, 1, …, N-1. Following is the idea once topological sorting is known.

The idea in below code is to first calculate min cost for station 1, then for station 2, and so on. These costs are stored in an array dist[0…N-1].

1) The min cost for station 0 is 0, i.e., dist[0] = 0

2) The min cost for station 1 is cost[0][1], i.e., dist[1] = cost[0][1]

3) The min cost for station 2 is minimum of following two.

a) dist[0] + cost[0][2]

b) dist[1] + cost[1][2]

3) The min cost for station 3 is minimum of following three.

a) dist[0] + cost[0][3]

b) dist[1] + cost[1][3]

c) dist[2] + cost[2][3]

Similarly, dist[4], dist[5], … dist[N-1] are calculated.

Below is the implementation of above idea.

## C++

`// A Dynamic Programming based solution to find min cost` `// to reach station N-1 from station 0.` `#include<iostream>` `#include<climits>` `using` `namespace` `std;` `#define INF INT_MAX` `#define N 4` `// This function returns the smallest possible cost to` `// reach station N-1 from station 0.` `int` `minCost(` `int` `cost[][N])` `{` ` ` `// dist[i] stores minimum cost to reach station i` ` ` `// from station 0.` ` ` `int` `dist[N];` ` ` `for` `(` `int` `i=0; i<N; i++)` ` ` `dist[i] = INF;` ` ` `dist[0] = 0;` ` ` `// Go through every station and check if using it` ` ` `// as an intermediate station gives better path` ` ` `for` `(` `int` `i=0; i<N; i++)` ` ` `for` `(` `int` `j=i+1; j<N; j++)` ` ` `if` `(dist[j] > dist[i] + cost[i][j])` ` ` `dist[j] = dist[i] + cost[i][j];` ` ` `return` `dist[N-1];` `}` `// Driver program to test above function` `int` `main()` `{` ` ` `int` `cost[N][N] = { {0, 15, 80, 90},` ` ` `{INF, 0, 40, 50},` ` ` `{INF, INF, 0, 70},` ` ` `{INF, INF, INF, 0}` ` ` `};` ` ` `cout << ` `"The Minimum cost to reach station "` ` ` `<< N << ` `" is "` `<< minCost(cost);` ` ` `return` `0;` `}` |

## Java

`// A Dynamic Programming based solution to find min cost` `// to reach station N-1 from station 0.` `class` `shortest_path` `{` ` ` `static` `int` `INF = Integer.MAX_VALUE,N = ` `4` `;` ` ` `// A recursive function to find the shortest path from` ` ` `// source 's' to destination 'd'.` ` ` ` ` `// This function returns the smallest possible cost to` ` ` `// reach station N-1 from station 0.` ` ` `static` `int` `minCost(` `int` `cost[][])` ` ` `{` ` ` `// dist[i] stores minimum cost to reach station i` ` ` `// from station 0.` ` ` `int` `dist[] = ` `new` `int` `[N];` ` ` `for` `(` `int` `i=` `0` `; i<N; i++)` ` ` `dist[i] = INF;` ` ` `dist[` `0` `] = ` `0` `;` ` ` ` ` `// Go through every station and check if using it` ` ` `// as an intermediate station gives better path` ` ` `for` `(` `int` `i=` `0` `; i<N; i++)` ` ` `for` `(` `int` `j=i+` `1` `; j<N; j++)` ` ` `if` `(dist[j] > dist[i] + cost[i][j])` ` ` `dist[j] = dist[i] + cost[i][j];` ` ` ` ` `return` `dist[N-` `1` `];` ` ` `}` ` ` ` ` `public` `static` `void` `main(String args[])` ` ` `{` ` ` `int` `cost[][] = { {` `0` `, ` `15` `, ` `80` `, ` `90` `},` ` ` `{INF, ` `0` `, ` `40` `, ` `50` `},` ` ` `{INF, INF, ` `0` `, ` `70` `},` ` ` `{INF, INF, INF, ` `0` `}` ` ` `};` ` ` `System.out.println(` `"The Minimum cost to reach station "` `+ N+` ` ` `" is "` `+minCost(cost));` ` ` `}` `}` `/* This code is contributed by Rajat Mishra */` |

## Python3

`# A Dynamic Programming based` `# solution to find min cost` `# to reach station N-1` `# from station 0.` `INF ` `=` `2147483647` `N ` `=` `4` ` ` `# This function returns the` `# smallest possible cost to` `# reach station N-1 from station 0.` `def` `minCost(cost):` ` ` `# dist[i] stores minimum` ` ` `# cost to reach station i` ` ` `# from station 0.` ` ` `dist` `=` `[` `0` `for` `i ` `in` `range` `(N)]` ` ` `for` `i ` `in` `range` `(N):` ` ` `dist[i] ` `=` `INF` ` ` `dist[` `0` `] ` `=` `0` ` ` ` ` `# Go through every station` ` ` `# and check if using it` ` ` `# as an intermediate station` ` ` `# gives better path` ` ` `for` `i ` `in` `range` `(N):` ` ` `for` `j ` `in` `range` `(i` `+` `1` `,N):` ` ` `if` `(dist[j] > dist[i] ` `+` `cost[i][j]):` ` ` `dist[j] ` `=` `dist[i] ` `+` `cost[i][j]` ` ` ` ` `return` `dist[N` `-` `1` `]` ` ` `# Driver program to` `# test above function` `cost` `=` `[ [` `0` `, ` `15` `, ` `80` `, ` `90` `],` ` ` `[INF, ` `0` `, ` `40` `, ` `50` `],` ` ` `[INF, INF, ` `0` `, ` `70` `],` ` ` `[INF, INF, INF, ` `0` `]]` ` ` `print` `(` `"The Minimum cost to reach station "` `,` ` ` `N,` `" is "` `,minCost(cost))` `# This code is contributed` `# by Anant Agarwal.` |

## C#

`// A Dynamic Programming based solution` `// to find min cost to reach station N-1` `// from station 0.` `using` `System;` `class` `GFG {` ` ` ` ` `static` `int` `INF = ` `int` `.MaxValue, N = 4;` ` ` `// A recursive function to find the` ` ` `// shortest path from source 's' to` ` ` `// destination 'd'.` ` ` ` ` `// This function returns the smallest` ` ` `// possible cost to reach station N-1` ` ` `// from station 0.` ` ` `static` `int` `minCost(` `int` `[,]cost)` ` ` `{` ` ` ` ` `// dist[i] stores minimum cost` ` ` `// to reach station i from` ` ` `// station 0.` ` ` `int` `[]dist = ` `new` `int` `[N];` ` ` ` ` `for` `(` `int` `i = 0; i < N; i++)` ` ` `dist[i] = INF;` ` ` ` ` `dist[0] = 0;` ` ` ` ` `// Go through every station and check` ` ` `// if using it as an intermediate` ` ` `// station gives better path` ` ` `for` `(` `int` `i = 0; i < N; i++)` ` ` `for` `(` `int` `j = i + 1; j < N; j++)` ` ` `if` `(dist[j] > dist[i] + cost[i,j])` ` ` `dist[j] = dist[i] + cost[i,j];` ` ` ` ` `return` `dist[N-1];` ` ` `}` ` ` ` ` `public` `static` `void` `Main()` ` ` `{` ` ` `int` `[,]cost = { {0, 15, 80, 90},` ` ` `{INF, 0, 40, 50},` ` ` `{INF, INF, 0, 70},` ` ` `{INF, INF, INF, 0} };` ` ` `Console.WriteLine(` `"The Minimum cost to"` ` ` `+ ` `" reach station "` `+ N` ` ` `+ ` `" is "` `+minCost(cost));` ` ` `}` `}` `// This code is contributed by Sam007.` |

## PHP

`<?php` `// A Dynamic Programming based solution to find min cost` `// to reach station N-1 from station 0.` `$INF` `=PHP_INT_MAX;` `$N` `= 4;` `// This function returns the smallest possible cost to` `// reach station N-1 from station 0.` `function` `minCost(` `$cost` `)` `{` `global` `$INF` `;` `global` `$N` `;` ` ` ` ` `// dist[i] stores minimum cost to reach station i` ` ` `// from station 0.` ` ` `$dist` `[` `$N` `]=` `array` `();` ` ` `for` `(` `$i` `=0; ` `$i` `<` `$N` `; ` `$i` `++)` ` ` `$dist` `[` `$i` `] = ` `$INF` `;` ` ` `$dist` `[0] = 0;` ` ` `// Go through every station and check if using it` ` ` `// as an intermediate station gives better path` ` ` `for` `(` `$i` `=0; ` `$i` `<` `$N` `; ` `$i` `++)` ` ` `for` `( ` `$j` `=` `$i` `+1; ` `$j` `<` `$N` `; ` `$j` `++)` ` ` `if` `(` `$dist` `[` `$j` `] > ` `$dist` `[` `$i` `] + ` `$cost` `[` `$i` `][` `$j` `])` ` ` `$dist` `[` `$j` `] = ` `$dist` `[` `$i` `] + ` `$cost` `[` `$i` `][` `$j` `];` ` ` `return` `$dist` `[` `$N` `-1];` `}` `// Driver program to test above function` ` ` `$cost` `=` `array` `(` `array` `(0, 15, 80, 90),` ` ` `array` `(INF, 0, 40, 50),` ` ` `array` `(INF, INF, 0, 70),` ` ` `array` `(INF, INF, INF, 0));` ` ` `echo` `"The Minimum cost to reach station "` `,` ` ` `$N` `, ` `" is "` `,minCost(` `$cost` `);` ` ` `?>` |

## Javascript

`<script>` ` ` `// A Dynamic Programming based solution` ` ` `// to find min cost to reach station N-1` ` ` `// from station 0.` ` ` ` ` `let INF = Number.MAX_VALUE, N = 4;` ` ` `// A recursive function to find the` ` ` `// shortest path from source 's' to` ` ` `// destination 'd'.` ` ` ` ` `// This function returns the smallest` ` ` `// possible cost to reach station N-1` ` ` `// from station 0.` ` ` `function` `minCost(cost)` ` ` `{` ` ` ` ` `// dist[i] stores minimum cost` ` ` `// to reach station i from` ` ` `// station 0.` ` ` `let dist = ` `new` `Array(N);` ` ` `dist.fill(0);` ` ` ` ` `for` `(let i = 0; i < N; i++)` ` ` `dist[i] = INF;` ` ` ` ` `dist[0] = 0;` ` ` ` ` `// Go through every station and check` ` ` `// if using it as an intermediate` ` ` `// station gives better path` ` ` `for` `(let i = 0; i < N; i++)` ` ` `for` `(let j = i + 1; j < N; j++)` ` ` `if` `(dist[j] > dist[i] + cost[i][j])` ` ` `dist[j] = dist[i] + cost[i][j];` ` ` ` ` `return` `dist[N-1];` ` ` `}` ` ` ` ` `let cost = [ [0, 15, 80, 90],` ` ` `[INF, 0, 40, 50],` ` ` `[INF, INF, 0, 70],` ` ` `[INF, INF, INF, 0] ];` ` ` `document.write(` `"The Minimum cost to"` ` ` `+ ` `" reach station "` `+ N` ` ` `+ ` `" is "` `+minCost(cost));` ` ` `</script>` |

Output:

The Minimum cost to reach station 4 is 65

This article is contributed by **Udit Gupta**. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready. To complete your preparation from learning a language to DS Algo and many more, please refer **Complete Interview Preparation Course****.**

In case you wish to attend **live classes **with experts, please refer **DSA Live Classes for Working Professionals **and **Competitive Programming Live for Students**.