外部OJ求助
  • 板块灌水区
  • 楼主01bit
  • 当前回复4
  • 已保存回复4
  • 发布时间2021/7/4 09:24
  • 上次更新2023/11/4 18:51:20
查看原帖
外部OJ求助
338147
01bit楼主2021/7/4 09:24

#include<cstdio>
#define state(x) (1<<x)
using namespace std;
int n,m;
int ch[15],f[15][state(15)]={};
int sit[state(15)],cnt=0;
void dfs(int x,int cur){
    if(cur>=m){
        // fprintf(stdout,"sit[%d]=%d;",cnt,x);
        sit[cnt++]=x;
        return;
    }
    dfs(x,cur+1);
    dfs(x|(1<<cur),cur+2);
}
bool isin(int i,int x){
    i=ch[i],x=sit[x];
    // fprintf(stdout,"%d|%d=%d;\n",i,x,i|x);
    if((i|x)!=i)return 0;
    return 1;
}
bool cando(int a,int b){
    if(sit[a]&sit[b])return 0;
    return 1;
}
int main(){
    scanf("%d%d",&n,&m);
    dfs(0,0);
    // printf("%d\n",(2|5)==2);
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++){
            int x;
            scanf("%d",&x);
            ch[i]=(ch[i]<<1)+x;
        }
    for(int i=0;i<cnt;i++)if(isin(0,i))f[0][i]=1;
    for(int i=1;i<n;i++)
        for(int j=0;j<cnt;j++)
            for(int k=0;k<cnt;k++){
                if(!isin(i,j)||!cando(j,k))continue;
				f[i][j]+=f[i-1][k];
				// fprintf(stdout,"f[%d][%d]=%d;\n",i,j,f[i][j]);
            }
    long long ans=0;
    for(int i=0;i<cnt;i++)if(isin(n-1,i))ans+=f[n-1][i];
    printf("%lld",ans);
    return 0;
}
2021/7/4 09:24
加载中...