给你n*2这么大的巧克力 问你有多少种分发,这道提想暴力都困难,先想到一中递推关系,先定义dp[i][j][z],i表示第i列,j表示i列内分成j部分,z表示第i列的两块巧克力处于分开的状态还是和并的状态!!
如图 也就是说如果已经是第i列,则如果添加第i+1列则有三种情况,第一种是还是j部分,也就是不加部分,第二种是加一部分,j+1,第三种是加两部分,j+2,
第一种情况是dp[i][j][1]=dp[i-1][j][0]*2+dp[i-1][j][1] ; dp[i][j][0]=dp[i-1][j][0]; 如图所示
第二种情况是dp[i][j][1]=dp[i-1][j-1][0]+dp[i-1][j-1][1]; dp[i][j][0]=dp[i-1][j-1][1]+dp[i-1][j-1][1]+2*dp[i-1][j-1][0]; 如图所示
第三种情况是dp[i][j][0]=dp[i-1][j-2][1]+dp[i-1][j-2][0]; 如图所示
然后将所有情况加到一起!!!!代码如下
#include<iostream>
#include<cstdio>
using namespace std;
int dp[1005][2005][3]={0};
int main()
{
int n,x,y;
dp[1][1][1]=1;dp[1][2][0]=1;//dp[2][1][1]=1;dp[2]
for(int i=2;i<=1002;i++){
for(int j=1;j<=i*2;j++){
dp[i][j][1]=(2*dp[i-1][j][0]+dp[i-1][j][1]+dp[i-1][j-1][0]+dp[i-1][j-1][1])%100000007;
dp[i][j][0]=(dp[i-1][j][0]+2*dp[i-1][j-1][1]+2*dp[i-1][j-1][0]+dp[i-1][j-2][0]+dp[i-1][j-2][1])%100000007;
}
}
scanf("%d",&n);
while(n--){
scanf("%d%d",&x,&y);
printf("%d\n",(dp[x][y][1]+dp[x][y][0])%100000007);
}
return 0;
}