leetcode的Hot100系列--62. 不同路径--简单的动态规划

题目比较清晰,简单来说就是:

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

只能往右或者往下,从A到L,能有几种走法。
这里使用动态规划的方法来做一下。
动态规划最重要的就是动态方程,这里简单说下这个动态方程怎么做出来的吧。


记 f(B) 为 A到B总共可以有的走法。
想知道f(L),那其实只要知道f(H)和f(K)就可以了。
因为从A到H之后,再想到L就只有一种方法,AK同理,所以 f(L) = f(H) + f(K)。

那f(H)呢,就等于 f(D)+f(G),这里就很容易得到他的动态方程:

f [i] [j] = f [i] [j-1] + f [i-1] [j] // i 代表行,j 代表列

得到状态方程之后,最后再考虑一下边界的情况,也就是 f(A) f(B) f(E) f(I) 等。
因为题目已经规定了,只能往右走,或者往下走,
所以第一行的走法都是只有1,第一列的走法也是只有1,可以得到:

1 1 1 1
1 f(F) f(G) f(H)
1 f(J) f(K) f( L)

so:f(F) = f(B) + f(E) = 1 + 1 = 2
f(G) = f(C) + f(F) = 1 + 2 = 3
f(H) = f(D) + f(G) = 1 + 3 = 4
f(J) = f(I) + f(F) = 1 + 2 = 3
f(K) = f(G) + f(J) = 3 + 3 = 6
f(L) = f(H) + f(K) = 4 + 6 = 10

这里附上代码:

int uniquePaths(int m, int n){
    int dp[100][100]={0}, i, j;
    for (i=0; i<m; i++)     // 这里初始化第一列的走法为1
        dp[i][0] = 1;
    for (i=0; i<n; i++)   // 这里初始化第一行的走法为1
        dp[0][i] = 1;
    
    for (i=1; i<m; i++)
    {
        for (j=1; j<n; j++)
        {
            dp[i][j] = dp[i-1][j] + dp[i][j-1];   // 动态方程
        }
    }
    
    return dp[m-1][n-1];
    
}

posted @ 2019-07-09 23:29  努力爬呀爬  阅读(372)  评论(0编辑  收藏  举报