这是HDU热身赛的其中一水题,当时没做出来……好吧!
可以有两种做法:
①记忆化搜索

#include <stdio.h>
__int64 f[32][32];
__int64 fun(int x,int y)
{
__int64 ans=0;
if(f[x][y]) return f[x][y];
ans+=fun(x-1,y+1);
if(y) ans+=fun(x,y-1);
return f[x][y]=ans;
}
int main()
{
int i,n;
for(i=0;i<=30;i++) f[1][i]=i+1;
while(scanf("%d",&n) && n)
{
printf("%I64d\n",fun(n,0));
}
return 0;
}
②DP

#include <stdio.h>
__int64 dp[31][30];
int main()
{
int i,j,n;
for(i=0;i<30;i++) dp[1][i]=i+1;
for(i=2;i<=30;i++)
{
dp[i][0]=dp[i-1][1];
for(j=1;j<=30-i;j++)
{
dp[i][j]=dp[i-1][j+1]+dp[i][j-1]; /*+ (j?dp[i][j-1]:0)*/
}
}
while(scanf("%d",&n) && n)
{
printf("%I64d\n",dp[n][0]);
}
return 0;
}
其实又听别人说是卡特兰数,这么说哪有第三种做法。。表示还不知道卡特兰数。。。