📜  矩阵中的最小奇数成本路径

📅  最后修改于: 2021-09-17 07:24:13             🧑  作者: Mango

给定一个矩阵,任务是找到到达矩阵底部的奇数最小路径的成本。如果不存在这样的路径,则打印 -1。
注意:只允许右下、左下和直接下移动。

例子:

Input: mat[] = 
{{ 1, 2, 3, 4, 6},
{ 1, 2, 3, 4, 5 },
{ 1, 2, 3, 4, 5 },
{ 1, 2, 3, 4, 5 },
{ 100, 2, 3, 4, 5 }

Output: 11

Input: mat[][] = 
{{1, 5, 2},
{7, 2, 2},
{2, 8, 1}}

Output: 5

方法:这个问题可以用动态规划解决:

  • 因为除了最左边和最右边之外的任何元素都可以直接从上、左上或右上行的块访问。所以,

最后,返回最后一行的最小奇数。如果它不存在,则返回 -1。

下面是上述方法的实现:

C++
// C++ program to find Minimum
// odd cost path in a matrix
#include 
#define M 100 // number of rows
#define N 100 // number of columns
using namespace std;
 
// Function to find the minimum cost
int find_min_odd_cost(int given[M][N], int m, int n)
{
    int floor[M][N] = { { 0 }, { 0 } };
    int min_odd_cost = 0;
    int i, j, temp;
 
    for (j = 0; j < n; j++)
        floor[0][j] = given[0][j];
 
    for (i = 1; i < m; i++)
        for (j = 0; j < n; j++) {
 
            // leftmost element
            if (j == 0) {
                floor[i][j] = given[i][j];
                floor[i][j] += min(floor[i - 1][j], floor[i - 1][j + 1]);
            }
 
            // rightmost element
            else if (j == n - 1) {
                floor[i][j] = given[i][j];
                floor[i][j] += min(floor[i - 1][j], floor[i - 1][j - 1]);
            }
 
            // Any element except leftmost and rightmost element of a row
            // is reachable from direct upper or left upper or right upper
            // row's block
            else {
 
                // Counting the minimum cost
                temp = min(floor[i - 1][j], floor[i - 1][j - 1]);
                temp = min(temp, floor[i - 1][j + 1]);
                floor[i][j] = given[i][j] + temp;
            }
        }
 
    min_odd_cost = INT_MAX;
 
    // Find the minimum cost
    for (j = 0; j < n; j++) {
        if (floor[n - 1][j] % 2 == 1) {
            if (min_odd_cost > floor[n - 1][j])
                min_odd_cost = floor[n - 1][j];
        }
    }
 
    if (min_odd_cost == INT_MIN)
        return -1;
 
    return min_odd_cost;
}
 
// Driver code
int main()
{
    int m = 5, n = 5;
    int given[M][N] = { { 1, 2, 3, 4, 6 },
                        { 1, 2, 3, 4, 5 },
                        { 1, 2, 3, 4, 5 },
                        { 1, 2, 3, 4, 5 },
                        { 100, 2, 3, 4, 5 } };
 
    cout << "Minimum odd cost is "
         << find_min_odd_cost(given, m, n);
 
    return 0;
}


Java
// Java program to find minimum odd
// cost path in a matrix
public class GFG {
 
    public static final int M = 100 ;
    public static final int N = 100 ;
     
    // Function to find the minimum cost
    static int find_min_odd_cost(int given[][], int m, int n)
    {
        int floor[][] = new int [M][N];
        int min_odd_cost = 0;
        int i, j, temp;
       
        for (j = 0; j < n; j++)
            floor[0][j] = given[0][j];
       
        for (i = 1; i < m; i++)
            for (j = 0; j < n; j++) {
       
                // leftmost element
                if (j == 0) {
                    floor[i][j] = given[i][j];
                    floor[i][j] += Math.min(floor[i - 1][j], floor[i - 1][j + 1]);
                }
       
                // rightmost element
                else if (j == n - 1) {
                    floor[i][j] = given[i][j];
                    floor[i][j] += Math.min(floor[i - 1][j], floor[i - 1][j - 1]);
                }
       
                // Any element except leftmost and rightmost element of a row
                // is reachable from direct upper or left upper or right upper
                // row's block
                else {
       
                    // Counting the minimum cost
                    temp = Math.min(floor[i - 1][j], floor[i - 1][j - 1]);
                    temp = Math.min(temp, floor[i - 1][j + 1]);
                    floor[i][j] = given[i][j] + temp;
                }
            }
       
        min_odd_cost = Integer.MAX_VALUE;
       
        // Find the minimum cost
        for (j = 0; j < n; j++) {
            if (floor[n - 1][j] % 2 == 1) {
                if (min_odd_cost > floor[n - 1][j])
                    min_odd_cost = floor[n - 1][j];
            }
        }
       
        if (min_odd_cost == Integer.MIN_VALUE)
            return -1;
       
        return min_odd_cost;
    }
    // Driver code
    public static void main(String args[])
    {
         int m = 5, n = 5;
            int given[][] = { { 1, 2, 3, 4, 6 },
                                { 1, 2, 3, 4, 5 },
                                { 1, 2, 3, 4, 5 },
                                { 1, 2, 3, 4, 5 },
                                { 100, 2, 3, 4, 5 } };
             
            System.out.println( "Minimum odd cost is " + find_min_odd_cost(given, m, n));
    }
    // This Code is contributed by ANKITRAI1
}


Python3
# Python3 program to find Minimum
# odd cost path in a matrix
M = 100 # number of rows
N = 100 # number of columns
 
# Function to find the minimum cost
def find_min_odd_cost(given, m, n):
 
    floor = [[0 for i in range(M)]
                for i in range(N)]
    min_odd_cost = 0
    i, j, temp = 0, 0, 0
 
    for j in range(n):
        floor[0][j] = given[0][j]
 
    for i in range(1, m):
        for j in range(n):
 
            # leftmost element
            if (j == 0):
                floor[i][j] = given[i][j];
                floor[i][j] += min(floor[i - 1][j],
                                   floor[i - 1][j + 1])
            # rightmost element
            elif (j == n - 1):
                floor[i][j] = given[i][j];
                floor[i][j] += min(floor[i - 1][j],
                                   floor[i - 1][j - 1])
 
            # Any element except leftmost and rightmost
            # element of a row is reachable from direct
            # upper or left upper or right upper row's block
            else:
                 
                # Counting the minimum cost
                temp = min(floor[i - 1][j],
                           floor[i - 1][j - 1])
                temp = min(temp, floor[i - 1][j + 1])
                floor[i][j] = given[i][j] + temp
 
    min_odd_cost = 10**9
 
    # Find the minimum cost
    for j in range(n):
        if (floor[n - 1][j] % 2 == 1):
            if (min_odd_cost > floor[n - 1][j]):
                min_odd_cost = floor[n - 1][j]
 
 
    if (min_odd_cost == -10**9):
        return -1;
 
    return min_odd_cost
 
# Driver code
m, n = 5, 5
given = [[ 1, 2, 3, 4, 6 ],
         [ 1, 2, 3, 4, 5 ],
         [ 1, 2, 3, 4, 5 ],
         [ 1, 2, 3, 4, 5 ],
         [ 100, 2, 3, 4, 5 ]]
 
print("Minimum odd cost is",
       find_min_odd_cost(given, m, n))
 
# This code is contributed by mohit kumar


C#
// C# program to find minimum odd
// cost path in a matrix
 
using System;
public class GFG {
  
    public static int M = 100 ;
    public static int N = 100 ;
      
    // Function to find the minimum cost
    static int find_min_odd_cost(int[,] given, int m, int n)
    {
        int[,] floor = new int [M,N];
        int min_odd_cost = 0;
        int i, j, temp;
        
        for (j = 0; j < n; j++)
            floor[0,j] = given[0,j];
        
        for (i = 1; i < m; i++)
            for (j = 0; j < n; j++) {
        
                // leftmost element
                if (j == 0) {
                    floor[i,j] = given[i,j];
                    floor[i,j] += Math.Min(floor[i - 1,j], floor[i - 1,j + 1]);
                }
        
                // rightmost element
                else if (j == n - 1) {
                    floor[i,j] = given[i,j];
                    floor[i,j] += Math.Min(floor[i - 1,j], floor[i - 1,j - 1]);
                }
        
                // Any element except leftmost and rightmost element of a row
                // is reachable from direct upper or left upper or right upper
                // row's block
                else {
        
                    // Counting the minimum cost
                    temp = Math.Min(floor[i - 1,j], floor[i - 1,j - 1]);
                    temp = Math.Min(temp, floor[i - 1,j + 1]);
                    floor[i,j] = given[i,j] + temp;
                }
            }
        
        min_odd_cost = int.MaxValue;
        
        // Find the minimum cost
        for (j = 0; j < n; j++) {
            if (floor[n - 1,j] % 2 == 1) {
                if (min_odd_cost > floor[n - 1,j])
                    min_odd_cost = floor[n - 1,j];
            }
        }
        
        if (min_odd_cost == int.MinValue)
            return -1;
        
        return min_odd_cost;
    }
    // Driver code
    public static void Main()
    {
         int m = 5, n = 5;
            int[,] given = { { 1, 2, 3, 4, 6 },
                                { 1, 2, 3, 4, 5 },
                                { 1, 2, 3, 4, 5 },
                                { 1, 2, 3, 4, 5 },
                                { 100, 2, 3, 4, 5 } };
              
            Console.Write( "Minimum odd cost is " +
                          find_min_odd_cost(given, m, n));
    }
   
}


PHP
 $floor1[$n - 1][$j])
                $min_odd_cost = $floor1[$n - 1][$j];
        }
    }
 
    if ($min_odd_cost == PHP_INT_MIN)
        return -1;
 
    return $min_odd_cost;
}
 
// Driver code
$m = 5; $n = 5;
$given = array(array(1, 2, 3, 4, 6),
               array(1, 2, 3, 4, 5),
               array(1, 2, 3, 4, 5),
               array(1, 2, 3, 4, 5),
               array(100, 2, 3, 4, 5));
 
echo "Minimum odd cost is " .
      find_min_odd_cost($given, $m, $n);
 
// This code is contributed by Akanksha Rai
?>


Javascript


输出:
Minimum odd cost is 11

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程