编一递归程序,求组合数 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;
}