互不侵犯

几乎是板子。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int f[10][100][1000],ans;
int n,k,cnt,iab[20],num[1000];
int can[1000],bai[20],pd[1000];
void dfs(int x){
    if(x==n+1){
        cnt++;
        for(int i=1;i<=n;i++)
            can[cnt]=2*can[cnt]+bai[i];
        for(int i=1;i<=n;i++)
            iab[i]=(bai[i]||bai[i-1]||bai[i+1]);
        for(int i=1;i<=n;i++)
            pd[cnt]=2*pd[cnt]+iab[i];
        for(int i=1;i<=n;i++)
            num[cnt]+=bai[i];
        return;
    }
    bai[x]=0;
    dfs(x+1);
    if(bai[x-1]==0){
        bai[x]=1;
        dfs(x+1);
    }
}
signed main(){
    cin>>n>>k;
    dfs(1);
    //for(int i=1;i<=cnt;i++)
    //    printf("%d %d\n",can[i],pd[i]);
    f[0][0][1]=1;
    for(int i=1;i<=n;i++){
        f[i][0][1]=1;
        for(int j=1;j<=k;j++)
            for(int p=1;p<=cnt;p++){
                for(int q=1;q<=cnt;q++)
                    if(num[p]+num[q]<=j&&(can[p]&pd[q])==0)
                        f[i][j][p]+=f[i-1][j-num[p]][q];
                //printf("%d %d %d %d\n",i,j,p,f[i][j][p]);
            }
    }
    for(int i=1;i<=cnt;i++)
        ans+=f[n][k][i];
    printf("%lld\n",ans);
    return 0;
}

深深地感到自己的弱小。

posted @ 2020-03-05 22:49  syzf2222  阅读(182)  评论(0编辑  收藏  举报