【动态规划】求二维数组走法路径种数

问题

给定二维数组,从左上走到右下的走法种树,数组中1代表该格可以走,0代表不能走。且只能向下和向右走。

解法

典型的动态规划问题:

dp[i][j]表示从[0][0]到[i][j]的走法数量。
状态转移方程:
dp[0][j] = 1  where i = 0
dp[i][0] = 1  where j = 0
dp[i][j] = dp[i-1][j] + dp[i][j-1] where arr[i][j] == 1
dp[i][j] = 0   where arr[i][j] == 0

代码实现

int arr_path_nums(vector<vector<int> > arr,int M,int N)
{
    int i,j;
    vector<vector<int> > dp(M,vector<int>(N,0));
    //初始条件
    for (i=0;i<M;i++)
        dp[i][0] = 1;
    for (j=0;j<N;j++)
        dp[0][j] = 1;
    for (i =1;i<M;i++)
    {
        for (j=1;j<N;j++)
        {
            if (arr[i][j] == 1)
            {
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
            else if (arr[i][j] == 0)
            {
                dp[i][j] = 0;
            }
            else
                return -1;
        }
    }
    return dp[M-1][N-1];
}

优化

本题依然可以用动态规划典型的空间优化方法,因为dp[i][j]是依赖左边和上边的值的,所以可以申请一个大小为N的数组,每次从后到前遍历即可。代码就不用给出了,很简单。

点赞