51Nod-1118-机器人走方格

M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。
Input
第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000)
Output
输出走法的数量。
Input示例
2 3
Output示例
3

这个题目可以用递归来解,如何递归呢?

首先我们需要一个递推公式,对于矩阵中的格子(i, j),假设从(1, 1)到它的路径数量为path(i, j),那么有:
path(i, j) = path(i - 1, j) + path(i, j - 1);
很好理解,因为机器人只能向右和下运动,因此它只能从(i - 1, j)或(i, j - 1)运动到(i, j)的,所以路径数量也就是到达这两个格子的路径数量之和。然后,我们需要一个初始条件,也就是递归终止条件,那是什么呢?当机器人在第一行或者第一列时,无论具体在哪儿,都只有一天路径可以从(1, 1)到达,所以我们的递归的初始条件和递推公式就有了。

然而,当我写好了递归,提交却挂了,因为超时,我只过了一半的数据,为此,只好采取内存换时间的办法,建立了一个存路径数量的数组,减少时间上的开销。

代码如下:

#include <stdio.h>
#include <string.h>
#define _MOD 1000000007
int map[1001][1001];

int path(int M, int N)
{
    if (map[M][N])
    {
        return map[M][N];
    }
    else if (M == 1 || N == 1)
    {
        map[M][N] = 1;
        return map[M][N];
    }
    map[M][N] = (path(M - 1, N) + path(M, N - 1)) % _MOD;
    return map[M][N];
}

int main(int argc, const char * argv[])
{
    int M, N, ans;

    while (~scanf("%d %d", &M, &N))
    {
        memset(map, 0, sizeof(int) * 1001 * 1001);
        ans = path(M, N);
        printf("%d\n", ans);
    }
    return 0;
}

你可能感兴趣的:(递归,记忆化)