此题为一道递推题,用f[i][j]表示有i个人最后一排为j个人的方案数。
#include<cstdio>
int n,f[1000][1000];
void init()
{
freopen("queue.in","r",stdin);
freopen("queue.out","w",stdout);
}
void readdata()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
f[i][i-1]=1;
}
for(int i=3;i<=n;i++)
{
f[i][0]=1;
}
}
void work()
{
for(int i=5;i<=n;i++)
{
for(int j=i-2;j>1;j--)
{
if(i-j<j)
{
for(int k=i-j-1;k>=0&&k<j;k--)
{
f[i][j]+=f[i-j][k];
}
}
else
{
for(int k=i-j-1;k>0;k--)
{
if(k>=j) continue;
f[i][j]+=f[i-j][k];
}
}
}
}
int m=0;
for(int i=1;i<=n;i++)
{
m+=f[n][i];
}
printf("%d\n",m);
/* for(int i=0;i<=n;i++)
{
for(int j=0;j<=n&&j<i;j++)
{
printf("%d,%d=",i,j);
printf("%d ",f[i][j]);
}
printf("\n");
}*/
}
int main()
{
// init();
readdata();
work();
//while(1);
return 0;
}