互不侵犯

几乎是板子。

#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;
}

深深地感到自己的弱小。

原文链接: https://www.cnblogs.com/syzf2222/p/12423473.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    互不侵犯

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/333656

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午9:17
下一篇 2023年3月1日 下午9:17

相关推荐