zoukankan      html  css  js  c++  java
  • bzoj1087互不侵犯King(状压)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1087

    简单的状压dp。但是wa了好几发。注意long long。

    注意0和0的连边。而且不能连成两条,所以放在外面写。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int N=15,M=1<<9;
    int n,m,lm,list[M+5][M+5],cnt[M+5],zt[M+5],xnt,nm[M+5];//那一维是N*N! 
    long long ans,dp[N][N*N][M+5];//
    int num(int s)
    {
        int cnt=0;
        while(s)cnt++,s-=(s&-s);
        return cnt;
    }
    void init()
    {
        lm=(1<<n);
        for(int s=0;s<lm;s++)
            if(((s<<1)&s)==0)
            {
                zt[++xnt]=s;
                nm[xnt]=num(s);
            }
        list[1][++cnt[1]]=1;
        for(int i=1;i<=xnt;i++)
            for(int j=i+1;j<=xnt;j++)
                if(((zt[i]<<1)&zt[j])==0&&((zt[i]>>1)&zt[j])==0&&(zt[i]&zt[j])==0)
                    list[i][++cnt[i]]=j,list[j][++cnt[j]]=i;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        init();
        for(int i=1;i<=xnt;i++)dp[1][nm[i]][i]=1;
        for(int i=2;i<=n;i++)
            for(int s=1;s<=xnt;s++)
                for(int j=nm[s];j<=m;j++)
                    for(int k=1;k<=cnt[s];k++)
                        dp[i][j][s]+=dp[i-1][j-nm[s]][list[s][k]];
    //                        printf("dp[%d][%d][%d]=%d(dp[%d][%d][%d]=%d) %d %d
    ",i,j,s,dp[i][j][s],
    //                                i-1,j-nm[s],list[s][k],dp[i-1][j-nm[s]][list[s][k]],zt[s],zt[list[s][k]]);
        for(int i=1;i<=xnt;i++)ans+=dp[n][m][i];
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    textarea组件
    switch组件
    slider组件
    radio组件
    picker-view组件
    picker组件 label组件讲解
    weui 框架
    微信小程序 input 组件
    在php中获取 数据库的内容,返回到页面
    微信小程序 form 组件
  • 原文地址:https://www.cnblogs.com/Narh/p/9142675.html
Copyright © 2011-2022 走看看