-
前言:
因为之前做了一道cf上面的题,需要用到组合数,并且数据过大,于是学习了一下在可能会爆精度的情况下组合数的求法。 -
公式:
-
普通的算法:
运用公式 C(n, m) = C(n-1, m) + C(n-1, m-1)
注意边界条件:C(i, 0) = 1; i in range(0, n+1)
代码:
int numTrees(int n) {
vector<vector<long long>> dp(2*n+1, vector<long long>(n+1));
for(int i = 0;i <= 2*n;i++){
dp[i][0] = 1;
}
for(int i = 1;i <= 2*n;i++){
for(int j = 1;j <= min(i, n);j++){
dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
cout<<"C "<<i<<" "<<j<<" = "<<dp[i][j]<<endl;
}
}
return dp[2*n][n]/(n+