#include<bits/stdc++.h>
#define ll long long
#define db double
#define ull unsigned ll
#define ldb long db
#define pii pair<int,int>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pll pair<ll,ll>
#define pdd pair<db,db>
#define F first
#define S second
#define pb push_back
using namespace std;
int n,k;
ll f[15][15][525],ans;
void trans(int lst,int msk,int I,ll x){
for(int T=0;T<(1<<n);++T) if(__builtin_popcount(T)<=lst && !(T&msk)){
bool flag=0;
for(int i=1;i<n;++i) if((T>>i&1) && (T>>(i-1)&1)){
flag=1;
break;
}
if(!flag) f[I][lst-__builtin_popcount(T)][(T|(T<<1)|(T>>1))&((1<<n)-1)]+=x;
}
}
int main(){
scanf("%d%d",&n,&k);
f[0][k][0]=1;
for(int i=0;i<n;++i) for(int j=0;j<=k;++j) for(int msk=0;msk<(1<<n);++msk) if(f[i][j][msk]) trans(j,msk,i+1,f[i][j][msk]);
for(int msk=0;msk<(1<<n);++msk) ans+=f[n][0][msk];
printf("%lld",ans);
return 0;
}
数据范围中,K≤N×N,最大为 81,但我的代码对应维只开了 15。

这是 LOJ 上的数据,事实证明这份代码确实是有问题的。
把 K 提一提就好了。