Skip to content

Min cost to reach last cell in 2D array

int findMinCost(int[][] cost, int row, int col)

    if row == -1 || col == -1
        return Integer.MAX_VALUE

    if row == 0 && col == 0
        return cost[0][0]

    int minCost1 = findMinCost(cost, row-1, col) // get min cost if we go up

    int minCost2 = findMinCost(cost, row, col -1) // left

    int minCost = integer.min(minCost1, minCost2)
    int currentCollsCost = cost[row][col]

    return minCost + currentCellsCost

Top Down approach

int findMinCost_aux(int[][] dp, int[][] array, int row, int col)

    if row == -1 || col == -1
        return Integer.MAX_VALUE

    if row == 0 && col == 0
        return array[0][0]

    if dp[row][col] == 0
        int minCost1 = findMinCost_aux(dp, array, row - 1, col)
        int minCost2 = findMinCost_aux(dp, array, row, col - 1)
        int minCost = Integer.min(minCost1, minCost2)
        int currentCellsCost = array[row][col]

        dp[row][col] = minCost + currentCellsCost

    return dp[row][col]

Bottom up

int findMinCost(int[][] array, int row, int col)

    int[][] dpo = new int[row + 1][col + 1]

    for int i = 0; i <= col; i++
        dp[0][i] = Integer.MAX_VALUE

    for int i = 0; i <= row; i++
        dp[i][0] = Integer.MAX_VALUE

    dp[0][1] = 0

    for int i = 1; i <= row; i ++
        for int j = 1; j <= col; j++
            dp[i][j] = Integer.min(dp[i-1][j], dp[i][j-1] + array[i-1][j-1])

    return dp[row][col]