暴力

来源:互联网 发布:剑三喵哥捏脸数据 编辑:程序博客网 时间:2024/04/28 15:51

用的暴力,状压dp怎么调也不过了23333333

#include<cstdio>#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<cstring>#include<cmath>using namespace std;int n,m,k,t;int a[100009];int vis[100009];long long ans;void dfs(int x){            if(x==n+1)    {        ans++;        return ;    }    if(a[x])dfs(x+1);    else {        if(x>=3)        if(!vis[x-k]){            vis[x-k]=1;            dfs(x+1);            vis[x-k]=0;            return ;        }        for(int i=max(x-k,1);i<=min(x+k,n);i++)        if(!vis[i]){            vis[i]=1;            dfs(x+1);            vis[i]=0;        }    }    return ;}int main(){    scanf("%d",&t);    while(t--) {        scanf("%d%d%d",&n,&m,&k);        memset(a,0,sizeof a);        memset(vis,0,sizeof vis);        ans=0;                for(int i=1;i<=m;i++) {            int x,y;            scanf("%d%d",&x,&y);            a[x]=y;            vis[y]=1;        }        dfs(1);        printf("%lld\n",ans);    }    return 0;}

50状压dp做法,调了一下午才发现优先级搞错了,&的优先级竟然比==高。。。。。。。
无语。。。。。。。。。。

  #include <cstdio>  #include <cstring>  #include <iostream>  using namespace std;  int n,m,kw,a,b,f[1<<21],cnt1[1<<21],cnte[1<<21];int w[19999];  int cntone(int state)  {      int s=0;      while(state!=0)    {         s+=state&1;        state=state>>1;     }     return s; }int t; int main() {   scanf("%d",&t);   while(t--){    memset(w,0,sizeof(w));    memset(f,0,sizeof(f));    scanf("%d%d%d",&n,&m,&kw);     for (int i=1;i<=m;i++)     {         scanf("%d%d",&a,&b);        w[a]=b;     }     f[0]=1;     for (int i=0;i<(1<<n);i++) cnt1[i]=cntone(i);    for (int i=1;i<=n;i++)     {         for (int j=(1<<n)-1;j>=0;j--)             if (cnt1[j]==i-1)                 for (int k=max(i-kw,1);k<=min(n,i+kw);k++)                 if(!w[i]||w[i]==k)                 if((j&(1<<(k-1)))==0)                     f[j|(1<<k-1)]+=f[j];     }     printf("%d",f[(1<<n)-1]);   }  }
原创粉丝点击