dp[i][j][2] 表示长度为i的串含j个相邻的1并且以0|1为结尾的个数。
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#define B(x) (1<<(x))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned ui;
const int oo = 0x3f3f3f3f;
const ll OO = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-9;
#define lson rt<<1
#define rson rt<<1|1
void cmax(int& a, int b){ if (b > a)a = b; }
void cmin(int& a, int b){ if (b < a)a = b; }
void cmax(ll& a, ll b){ if (b > a)a = b; }
void cmin(ll& a, ll b){ if (b < a)a = b; }
void cmax(double& a, double b){ if (a - b < eps) a = b; }
void cmin(double& a, double b){ if (b - a < eps) a = b; }
void add(int& a, int b, int mod){ a = (a + b) % mod; }
void add(ll& a, ll b, ll mod){ a = (a + b) % mod; }
const ll MOD = 1000000007;
const int maxn = 110;
ll dp[maxn][maxn][2];
void Init(){
memset(dp, 0, sizeof dp);
dp[1][0][0] = 1;
dp[1][0][1] = 1;
for (int i = 1; i < maxn - 1; i++){
for (int j = 0; j < i; j++){
dp[i + 1][j][0] += dp[i][j][0];
dp[i + 1][j][1] += dp[i][j][0];
dp[i + 1][j][0] += dp[i][j][1];
dp[i + 1][j + 1][1] += dp[i][j][1];
}
}
}
int main(){
//freopen("E:\\read.txt", "r", stdin);
Init();
int T, n, k, cas;
scanf("%d", &T);
while (T--){
scanf("%d %d %d", &cas, &n, &k);
printf("%d %lld\n", cas, dp[n][k][0] + dp[n][k][1]);
}
return 0;
}