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 ;
}