DP状态:dp[i][j][1]表示前i个分成j部分并且最后一行被分在不同的部分中的个数,dp[i][j][0]表示前i个分成j部分并且最后一行被分在相同的部分中的个数
可以先预处理出1000内所有的,然后只需要查询即可。
/*
author : csuchenan
prog : hdu4301
algorithm : DP dp[i][j][0],表示前i个分成j分并且最好一行在同一块中的个数,
dp[i][j][1].表示前i个分成j分并且最后一行分在不同的块具体看程序
2012-10-19 23:02:18 Accepted 4301 31MS 16024K 801 B C++ csu_chenan
*/
#include <cstdio>
#include <cstring>
const int mod = 100000007;
const int maxn = 1005;
int dp[maxn][maxn*2][2];
int n, k;
int main(){
int T;
memset(dp, 0, sizeof(dp));
dp[1][1][0] = 1;
dp[1][2][1] = 1;
for(int i = 2; i <= 1000; i ++){
dp[i][1][0] = 1;
for(int j = 2; j <= i * 2; j ++){
dp[i][j][0] = (dp[i][j][0] + dp[i-1][j-1][0] + dp[i-1][j-1][1] +
dp[i-1][j][0] + 2*dp[i-1][j][1])%mod;
dp[i][j][1] = (dp[i-1][j-2][0] + dp[i-1][j][1] + dp[i][j][1]+
dp[i-1][j-1][0]*2 + dp[i-1][j-1][1]*2 + dp[i-1][j-2][1])%mod;
}
}
scanf("%d", &T);
while(T--){
scanf("%d%d", &n , &k);
printf("%d\n", (dp[n][k][1] + dp[n][k][0])%mod);
}
return 0 ;
}