题意
给你一个n问你对这n个人排列使得是波浪型的方案数有多少
题解
我们定义这n个人是1,2,3......n的从小到大的排列方式,当遍历到第i个人时,我们要将这个人插入到前面的i-1个人中,那么我们要怎么插入呢,假设我们插入的这个位置为k,那么k前面的两个人应该满足是下降的,后面的两个人应该是满足上升的,。然后就可以dp啦。
dp[i][0]表示有i个人满足最后两个人是下降的种数
dp[i][1]表示有i个人满足前面两个人是上升的种数
假设k前面有j个人,我们插入的位置应该是从0-i这个位置都能插入。
#include <iostream>
using namespace std;
typedef long long ll;
ll dp[22][22];
ll c[22][22];
int main()
{
for(int i=1;i<22;i++)
{
c[i][0]=c[i][i]=1;
for(int j=1;j<i;j++)
c[i][j]=c[i-1][j-1]+c[i-1][j];
}
dp[0][0]=dp[0][1]=dp[1][1]=dp[1][0]=1;
for(int i=2;i<22;i++)
{
ll res=0;
for(int j=0;j<=i;j++)
res+=dp[j][0]*dp[i-1-j][1]*c[i-1][j];
dp[i][0]=dp[i][1]=res/2;
}
int T;cin>>T;
while(T--)
{
int a,b;
scanf("%d%d",&a,&b);
if(b==1) printf("%d 1\n",a);
else printf("%d %lld\n",a,dp[b][1]+dp[b][0]);
}
return 0;
}