#include
],
in[
600],dp[
10][
900][
100],ans; void init() { scanf("%lld%lld",&n,&
kk); } void pre() { nn=(
1<
1; for(
inti=
0;i<=nn;i++
) { intpre=-
1; for(
intj=
0;j<=
8;j++
) { if(i&(
1<<
j)) { if(j+
1-pre<
2)
break; in[i]++
; pre=j+
1; } if(j==
8) ok[i]=
1; } } } intcheck(
inta,
int b) { for(
inti=
0;i<=
8;i++
) { if(a&(
1<<
i)) { if(b&(
1<
return 0; if(i-
1>=
0&&(b&(
1<
1)))
return 0; if(i+
1<=
8&&(b&(
1<
1)))
return 0; } } return 1; } void solve() { for(
inti=
0;i<=nn;i++)
if(ok[i]) dp[
1][i][
in[i]]=
1; for(
inti=
2;i<=n;i++
) { for(
intj=
0;j<=nn;j++)
if(ok[j]){ for(
intk=
0;k<=nn;k++)
if(ok[k]) { if(check(j,k)){ for(
intl=
0;l<=kk;l++)
if(l+
in[j]<=
kk){ dp[i][j][l+
in[j]]+=dp[i-
1][k][l]; } } } } } for(
inti=
0;i<=nn;i++
) if(ok[i]) ans+=
dp[n][i][kk]; printf("%lld\n",ans); } int main() { //freopen(".in","r",stdin); //freopen(".out","w",stdout); init(); pre(); solve(); return 0; }来源: http://www.bubuko.com/infodetail-2314407.html