就是从(0,0)->(n,n)的最短路径数,但是路径不能过对角线,就是要么就在左上半角走,要么就在右上半角走。这题用到了卡特兰数的知识,不懂的话可以去查来学习下。
这题可以用DP
dp[i][j]=dp[i-1][j]+dp[i][j-1]; (j<=i)
这样的复杂度是o(n*n)对于这题已经可以了
如果n很大的话比如n<=1000000
这个时候要用公式,可以推出一个组合公式的
#include"stdio.h"
typedef __int64 lld;
const int MAX=36;
lld dp[MAX][MAX]={0};
int main()
{
int i,j;
int n,CS=1;
dp[0][0]=1;
for(i=0;i
{
if(i==j&&j==0)continue;
if(i-1>=0)dp[i][j]+=dp[i-1][j];
if(j-1>=0)dp[i][j]+=dp[i][j-1];
}
while(scanf("%d",&n)!=EOF&&n>0)
{
printf("%d %d %I64d\n",CS++,n,dp[n][n]*2);//不穿越可以走上面或者下面,所以是两倍
}
return 0;
}