leetcode的Hot100系列--64. 最小路径和--权值最小的动态规划

如果这个:
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];
}
posted @ 2019-07-10 00:03  努力爬呀爬  阅读(439)  评论(0编辑  收藏  举报