给一个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; }