改到最后几乎和2018-11-14 20:12:22的那篇题解一样了
然而只有30分 只能过前三个点
无法理解
#include <algorithm>
#include <cstdio>
#define int long long
using namespace std;
int num[10];
int line[200];
int ans;
int n,K;
int dp[10][200][200];
int cnt;
int ycl(int x)
{
cnt=0;
for(int i=0;i<(1<<x);i++)
{
if( (i&(i<<1)) )continue;
cnt++;
int sum=0;
for(int j=0;j<n;++j)
if(i&(1<<j))++sum;
num[cnt]=sum;
line[cnt]=i;
}
}
signed main()
{
scanf("%lld%lld",&n,&K);
ycl(n);
dp[0][1][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=cnt;j++)
{
for(int k=0;k<=K;k++)
{
if(k>=num[j])
{
for(int ls=1;ls<=cnt;ls++)
{
if(!(line[ls]&line[j])&&!(line[ls]&(line[j]<<1))&&!(line[ls]&(line[j]>>1)))
{
dp[i][j][k]+=dp[i-1][ls][k-num[j]];
// printf("dp[%d][%d][%d]uped from dp[%d][%d][%d] to num%d king=%d\n",i,j,k,i-1,ls,k-num[j],dp[i][j][k],k+num[j]);
}
}
}
}
}
}
for(int j=1;j<=cnt;j++)
{
ans+=dp[n][j][K];
}
printf("%lld",ans);
return 0;
}