递归求组合数加强版本

编一递归程序,求组合数 C(n,m)
已知 C(n,m)=C(n-1,m)+C(n-1,m-1);

Input

一行给出n,m
一行两个数字N,M,其值小于等于5000

Output

方案数%1000000007

思路:这道题用这种方法肯定会超时,然而我们发现普通的递归会重复计算很多数,比如算C(2,2)的时候,在C(2,3)的时候算过了,可是又要重新计算,耗费了大量的时间,所以我们可以用记忆化来写,用一个数组来保存这个值有没有算过,如果算过了,就直接调用,如果没有,就老老实实的去算

CODE:

#include <bits/stdc++.h>
using namespace std;
long long a[5010][5010];
long long dfs(long long n, long long m) {
    long long sum;

    if (n == m || m == 0)//递归边界
        return 1;

    if (a[n][m] != -1)//算过了
        return a[n][m] % 1000000007;//记得取模1000000007
    else {
        sum = dfs(n - 1, m) + dfs(n - 1, m - 1);
        a[n][m] = sum;
    }

    return sum % 1000000007;
}
int main() {
    long long n, m;
    cin >> n >> m;
    memset(a, -1, sizeof(a));//初始化
    cout << dfs(n, m) % 1000000007 << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_55599629/article/details/119964272