题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1173
题意:将1到n进行排列成高低交错的数列有多少种?
思路:f[n][i][0]表示n个数以i开始前两个数升序的个数;f[n][i][0]=sigama(f[n-1][j][1])(i<=j<=n-1)
f[n][i][1]表示n个数以i开始前两个数降序的个数;f[n][i][1]=sigama(f[n-1][j][0])(1<=j<=i-1)
#include <iostream>
#include <cstdio>
#define i64 unsigned long long
using namespace std;
int C,num=0;
int n,m;
i64 f[55][55][2];
void init()
{
int i,j,n;
f[1][1][0]=1;
f[1][1][1]=1;
for(n=2;n<=50;n++) for(i=1;i<=n;i++)
{
for(j=i;j<=n-1;j++) f[n][i][0]+=f[n-1][j][1];
for(j=1;j<i;j++) f[n][i][1]+=f[n-1][j][0];
}
}
i64 DP()
{
i64 ans=0;
int i;
if(m>1)
{
for(i=1;i<=m-1;i++) ans+=f[n-1][i][0];
}
else
{
if(n<=2) ans=1;
else ans=f[n-1][2][1];
}
return ans;
}
int main()
{
init();
for(scanf("%d",&C);C--;)
{
scanf("%d%d",&n,&m);
printf("Case %d: %llu\n",++num,DP());
}
return 0;
}