#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[110][110][2];
void getsolve(){
memset(dp,0,sizeof(dp));
dp[1][1][1]=0;
dp[1][0][1]=1;
dp[1][0][0]=1;
dp[1][1][0]=0;
for(int i=2;i<=100;i++){
for(int j=0;j<=100;j++){
dp[i][j][0]=dp[i-1][j][1]+dp[i-1][j][0];
if(j>=0)
dp[i][j][1]=dp[i-1][j-1][1]+dp[i-1][j][0];
}
}
}
int main()
{
getsolve();
int t,n,m;
scanf("%d",&t);
while(t--){
int c;
scanf("%d%d%d",&c,&n,&m);
printf("%d %d\n",c,dp[n][m][0]+dp[n][m][1]);
}
return 0;
}
分析:dp[i][j][?]表示总共有i位,j表示根据规律求出的和为j,其中?=0表示i这个值为0,?=1表示i这个值为1;又根据计算原则:有两个相邻的1则值为1,所以可得如下状态转移方程
状态转移方程:dp[i][j][0]=dp[i-1][j][1]+dp[i-1][j][0];
dp[i][j][1]=dp[i-1][j-1][1]+dp[i-1][j][0];