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

博客围绕LeetCode的Hot100系列62题不同路径展开,指出本题与常见题不同之处在于每条路径有权值,需比较不同走法权值大小。要对第一行和第一列权值累加,还给出动态方程f [i] [j] = min( f [i] [j-1] + f [i-1] [j] ) + 1,每个点记录从开始到当前点的最小值。

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

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

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

ABCD
EFGH
IJKL

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

1234
2f(F)f(G)f(H)
3f(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];
}

转载于:https://www.cnblogs.com/payapa/p/11161337.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值