互不侵犯

几乎是板子。

复制代码
#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 @   syzf2222  阅读(183)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示