如果这个:
leadcode的Hot100系列--62. 不同路径--简单的动态规划

看懂的话,那这题基本上是一样的,
不同点在于:
1、这里每条路径相当于多了一个权值
2、结论不再固定,而是要比较不同走法哪个权值更小

针对第一点,需要把第一行和第一列的权值做一个累加:
假设这里的权值都是1,则

中,f(A) 为1,f(B) 就为2,,因为A和B各有一个权值,f(C)为3,f(E) 为2,f(I)为3:

要想 f(F) 小,则要比较f(B)和f(E)哪个小,所以 f(F) = min( f(F), f(E) ) + 1。
所以很容易得到动态方程:

所以,每个点记录的从开始到当前点的最小值。


int min(int a, int b)
{
    return a<b?a:b;
}

int minPathSum(int** grid, int gridSize, int* gridColSize){
    int p[gridSize][*gridColSize];
    int sum = 0, i,j;

    for (i=0; i<gridSize; i++)    // 先算出第一列的权值
    {
        sum += grid[i][0];
        p[i][0] = sum;
    }
    sum = 0;
    for (i=0; i<*gridColSize; i++)    // 先算出第一行的权值
    {
        sum += grid[0][i];
        p[0][i] = sum;
    }

    for (i=1; i<gridSize; i++)
    {
        for (j=1; j<*gridColSize; j++)
        {
            p[i][j] = min(p[i][j-1], p[i-1][j]) + grid[i][j];    //  动态方程
        }
    }
    return p[gridSize-1][*gridColSize-1];
}
07-10 08:44