📜  最小成本路径的 C 程序

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

给定成本矩阵 cost[][] 和在 cost[][] 中的位置 (m, n),编写一个函数,返回从 (0, 0) 到达 (m, n) 的最小成本路径的成本。矩阵的每个单元格表示遍历该单元格的成本。到达路径的总成本 (m, n) 是该路径(包括源和目的地)上所有成本的总和。您只能从给定的单元格向下、向右和斜下方的单元格遍历,即从给定的单元格 (i, j)、单元格 (i+1, j)、(i, j+1) 和 (i+1, j+1) 可以遍历。您可以假设所有成本都是正整数。

例如,在下图中,到 (2, 2) 的最小成本路径是什么?

下图突出显示了成本最低的路径。路径是(0, 0) –> (0, 1) –> (1, 2) –> (2, 2)。路径的成本是 8 (1 + 2 + 2 + 3)。

/* Dynamic Programming implementation of MCP problem */
#include 
#include 
#define R 3
#define C 3
  
int min(int x, int y, int z);
  
int minCost(int cost[R][C], int m, int n)
{
    int i, j;
  
    // Instead of following line, we can use int tc[m+1][n+1] or
    // dynamically allocate memoery to save space. The following line is
    // used to keep te program simple and make it working on all compilers.
    int tc[R][C];
  
    tc[0][0] = cost[0][0];
  
    /* Initialize first column of total cost(tc) array */
    for (i = 1; i <= m; i++)
        tc[i][0] = tc[i - 1][0] + cost[i][0];
  
    /* Initialize first row of tc array */
    for (j = 1; j <= n; j++)
        tc[0][j] = tc[0][j - 1] + cost[0][j];
  
    /* Construct rest of the tc array */
    for (i = 1; i <= m; i++)
        for (j = 1; j <= n; j++)
            tc[i][j] = min(tc[i - 1][j - 1],
                           tc[i - 1][j],
                           tc[i][j - 1])
                       + cost[i][j];
  
    return tc[m][n];
}
  
/* A utility function that returns minimum of 3 integers */
int min(int x, int y, int z)
{
    if (x < y)
        return (x < z) ? x : z;
    else
        return (y < z) ? y : z;
}
  
/* Driver program to test above functions */
int main()
{
    int cost[R][C] = { { 1, 2, 3 },
                       { 4, 8, 2 },
                       { 1, 5, 3 } };
    printf(" %d ", minCost(cost, 2, 2));
    return 0;
}
输出:
8

请参阅关于动态规划的完整文章 |设置 6(最小成本路径)了解更多详情!

想要从精选的视频和练习题中学习,请查看C 基础到高级C 基础课程