解题思路:
预处理出所有答案,dp转移放何曾见代码
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define LL long long
using namespace std;
const int mod = 1e8 + 7;
const int MAXN = 1000 + 10;
int dp[MAXN][2][MAXN*2];
int N, M;
void init()
{
memset(dp, 0, sizeof(dp));
dp[1][0][1] = dp[1][1][2] = 1;
for(int i=1;i<1000;i++)
{
for(int j=1;j<=2*i;j++)
{
dp[i+1][0][j] = (dp[i+1][0][j] + dp[i][0][j] + dp[i][1][j] * 2) % mod;
dp[i+1][0][j+1] = (dp[i+1][0][j+1] + dp[i][0][j] + dp[i][1][j]) % mod;
dp[i+1][1][j] = (dp[i+1][1][j] + dp[i][1][j]) % mod;
dp[i+1][1][j+1] = (dp[i+1][1][j+1] + dp[i][0][j]*2 + dp[i][1][j] * 2) % mod;
dp[i+1][1][j+2] = (dp[i+1][1][j+2] + dp[i][0][j] + dp[i][1][j]) % mod;
}
}
}
int main()
{
int T;
init();
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &N, &M);
printf("%d\n", (dp[N][0][M] + dp[N][1][M]) % mod);
}
return 0;
}