leadcode的Hot100系列--64. 最小路徑和--權值最小的動態規劃

努力爬呀爬發表於2019-07-10

如果這個:
leadcode的Hot100系列--62. 不同路徑--簡單的動態規劃

看懂的話,那這題基本上是一樣的,
不同點在於:
1、這裡每條路徑相當於多了一個權值
2、結論不再固定,而是要比較不同走法哪個權值更小

針對第一點,需要把第一行和第一列的權值做一個累加:
假設這裡的權值都是1,則

A B C D
E F G H
I J K L

中,f(A) 為1,f(B) 就為2,,因為A和B各有一個權值,f(C)為3,f(E) 為2,f(I)為3:

1 2 3 4
2 f(F) f(G) f(H)
3 f(J) f(K) f( L)

要想 f(F) 小,則要比較f(B)和f(E)哪個小,所以 f(F) = min( f(F), f(E) ) + 1。
所以很容易得到動態方程:

f [i] [j] = min( f [i] [j-1] + f [i-1] [j] ) + 1 // i 代表行,j 代表列,最後加的1,是假設當前的點的權值是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];
}

相關文章