给一个2*n 的chocolate 分成一定的块数 问有多少种情况
DP 递推
link[][]表示 到第 i 排 第i排相连 分成 j 块有多少种情况
nolink[][]表示 到第 i 排 第i排不相连 分成j块有多少种情况
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<cmath>
#include<stack>
#include<algorithm>
using namespace std;
const int N=1001;
const int MOD=100000007;
int link[N][N*2];
int nolink[N][N*2];
void begin()
{
link[1][2]=0;
nolink[1][2]=1;
for(int j=3;j<N*2-1;++j)//一些边界处理
{
link[1][j]=0;
nolink[1][j]=0;
}
for(int i=1;i<N;++i)//一些边界处理
{
nolink[i][2*N-1]=0;
link[i][0]=0;
nolink[i][0]=0;
link[i][1]=1;
nolink[i][1]=0;
}
for(int i=2;i<N;++i)
{
for(int j=2;j<2*N-1;++j)
{
link[i][j]=(link[i-1][j]+link[i-1][j-1]+nolink[i-1][j-1]+nolink[i-1][j]*2)%MOD;
nolink[i][j]=(link[i-1][j-1]*2+link[i-1][j-2]+nolink[i-1][j]+nolink[i-1][j-1]*2+nolink[i-1][j-2])%MOD;
}
}
}
int main()
{
int T;
scanf("%d",&T);
begin();
while(T--)
{
int x,y;
scanf("%d %d",&x,&y);
printf("%d\n",(link[x][y]+nolink[x][y])%MOD);
}
return 0;
}
浙公网安备 33010602011771号