HDU 4165 pills

这是HDU热身赛的其中一水题,当时没做出来……好吧!

可以有两种做法:

①记忆化搜索

View Code
#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

View Code
#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;
}


其实又听别人说是卡特兰数,这么说哪有第三种做法。。表示还不知道卡特兰数。。。

你可能感兴趣的:(HDU)