给定n个人,排成一个波浪形的队伍,n个人按个头高低已经编好号了。有个队长编号为m,队长是必须在最前面的,如果m=1..就不用管,否则队长后面那个要比他低...
读题坑,公式写了半天没推出来看了别人博客恍然大悟。
附上连接:点击打开链接
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mod 100000007
#define inf 0x3f3f3f3f
ull dp[55][55][2];
void db()
{
dp[1][1][0]=dp[1][1][1]=1;
for(int i=2;i<=50;i++)
{
for(int j=1;j<=i;j++)
{
for(int k=1;k<i;k++)
{
if(k<j)
dp[i][j][1]+=dp[i-1][k][0];
else
dp[i][j][0]+=dp[i-1][k][1];
}
}
}
}
int main()
{
int t;
db();
scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
int n,m;
scanf("%d %d",&n,&m);
ull ans=0;
if(m==1)
{
if(n<=2) ans=1;
else ans=dp[n-1][2][1];
}
else
{
for(int i=1;i<=m-1;i++)
ans+=dp[n-1][i][0];
}
printf("Case %d: %llu\n",cas,ans);
}
return 0;
}