这题明显不能用状压dp的, 题解几篇都错的

P2622 关灯问题II

@[tlnllkbp](/space/show?uid=106177) -1是什么东西
by 老K @ 2018-10-15 20:29:30


打扰了
by 老K @ 2018-10-15 20:29:42


所以这个数据正解是3吗
by niiick @ 2018-10-15 20:43:24


@[niiick](/space/show?uid=60885) 是啊, 只用状压的是-1
by tlnllkbp @ 2018-10-15 20:44:16


嗯。。还以为自己的题解也被叉掉了
by niiick @ 2018-10-15 20:47:22


状压跑的出来啊,我跑的就是3。。。
by Soulist @ 2018-10-16 08:26:20


状压可以,只是跑地太慢
by qsmoonzh @ 2018-10-23 15:15:06


@[Mital](/space/show?uid=30036) 请问可以学习一下您的做法吗
by lqhsr @ 2019-10-31 19:30:20


状缩-1
by gjh303987897 @ 2019-11-09 15:07:54


``` #include<bits/stdc++.h> #define IL inline #define RI register int IL void in(int &x) { int f=1;x=0;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} x*=f; } int a[108][18],f[2048],n,m; int main() { in(n),in(m); memset(f,0x3f,sizeof f); for(RI i=1;i<=m;i++) for(RI j=1;j<=n;j++) in(a[i][j]); f[(1<<n)-1]=0; for(RI i=(1<<n)-1;i>=0;i--) { for(RI j=1;j<=m;j++) { int now=i; for(RI l=1;l<=n;l++) { if(a[j][l]==0)continue; if(a[j][l]==1&&(i&(1<<(l-1)))) now^=(1<<(l-1)); if(a[j][l]==-1&&!(i&(1<<(l-1)))) now^=(1<<(l-1)); } f[now]=std::min(f[now],f[i]+1); } } for(RI i=(1<<n)-1;i>=0;i--) { for(RI j=1;j<=m;j++) { int now=i; for(RI l=1;l<=n;l++) { if(a[j][l]==0)continue; if(a[j][l]==1&&(i&(1<<(l-1)))) now^=(1<<(l-1)); if(a[j][l]==-1&&!(i&(1<<(l-1)))) now^=(1<<(l-1)); } f[now]=std::min(f[now],f[i]+1); } } printf("%d",f[0]==1061109567?-1:f[0]); } ``` @[tlnllkbp](/user/106177) 这样呢
by yoy68 @ 2020-04-06 22:51:40


| 下一页