题面
分析
(dp) 的话设 (f_{i,0/1}) 表示第 (i) 列填的两个是否相同
那么接下来是很繁琐的转移
直接看代码吧
(Code)
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
const LL P = 1e8 + 7;
int n , k;
LL f[1005][2005][2];
int main()
{
scanf("%d%d" , &n , &k);
f[1][1][1] = f[1][2][0] = 1;
for(register int i = 2; i <= n; i++)
for(register int j = 1; j <= min(2 * i , k); j++)
f[i][j][1] = (f[i][j][1] + f[i - 1][j][1] + f[i - 1][j - 1][0] + f[i - 1][j - 1][1] + 2 * f[i - 1][j][0]) % P ,
f[i][j][0] = (f[i][j][0] + 2 * f[i - 1][j - 1][0] + 2 * f[i - 1][j - 1][1] + f[i - 1][j][0] +
f[i - 1][j - 2][0] + f[i - 1][j - 2][1]) % P;
printf("%lld" , (f[n][k][0] + f[n][k][1]) % P);
}