这题的结果是卡塔兰数的2倍,因为有2种可能,只从对角线下方走和只从对角线上方走。
2*catlan(n)即为结果,其中catlan(n)=
不过如果直接利用此公式编写代码的话,需要注意组合数在计算过程中的溢出。
此题不建议直接用公式来计算,因为我们可以容易地找到递推公式。
假设坐标原点位于左上角,dp[i][j]表示只从对角线上方走时,从坐标(0,0)到(i,j)的路径数,所以有如下结果:
dp[0][0]=1
dp[i][j]=dp[i-1][j]+dp[i][j-1]
源代码如下:
#include <iostream>
#include <iomanip>
#include <cmath>
#define PI 3.1415927
using namespace std;
//this fuction has a bug, sum might overflow during the calculation
long long Catlan(int N) {
long long sum = 1;
for(int i=1;i<N; i++) {
sum=sum*(N+1+i)/i;
}
sum/=N;
return sum;
}
int main()
{
int n;
int id=0;
while(cin >> n) {
if(n==-1) break;
long long dp[36][36]={0};
dp[0][0]=1;
for(int i=0; i<=n; i++) {
for(int j=0; j<=i; j++) {
if(i-1>=0)dp[i][j]+=dp[i-1][j];
if(j-1>=0)dp[i][j]+=dp[i][j-1];
}
}
cout << id+1 << " " << n << " " << 2*dp[n][n] << endl;
id++;
}
return 0;
}