点灯游戏应该很多人都在小时候頽过吧
反正我直到现在也不会
很明显一个灯最多只需要点一次
然后高斯消元
解完肯定剩*元(就是那些全是0的行)
然后这些都爆搜
由于剩下的*元不会太多
所以时间复杂度$O(能过)$
以上
#include<cstdio> #include<algorithm> using std::swap; ; template<typename tp>void read(tp &kk){ tp ret=,f=;char ch=getchar(); ;ch=getchar();} +ch-';ch=getchar();} kk=ret*f; } int n,a[N][N]; void gauss() { ;l<=n;l++) { int g=l; while(g<=n&&(!a[g][l])) g++; if(g>n) continue; if(l!=g) ;i++) swap(a[l][i],a[g][i]); ;i<=n;i++) { if(a[i][l]&&i!=l) { ;j++) a[i][j]^=a[l][j]; } } } } int ans; void wtf(int l,int x) { if(x>ans) return; if(!l){ans=x;return;} ,x+a[l][n+]); else { ]) return; wtf(l-,x); ;i;i--) a[i][n+]^=a[i][l]; wtf(l-,x+); ;i;i--) a[i][n+]^=a[i][l]; } } int m,xi,yi; int main() { read(n),read(m); ;i<=n;i++) a[i][i]=a[i][n+]=; ;i<=m;i++) { read(xi),read(yi); a[xi][yi]^=,a[yi][xi]^=; } gauss(); ans=n; wtf(n,); printf("%d\n",ans); ; }
orz