状压求调!
查看原帖
状压求调!
519573
Daniel_yao楼主2023/5/27 15:42
#include <bits/stdc++.h>
#define int long long
#define H 19260817
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 100000000

using namespace std;

inline int read() {
  rint x=0,f=1;char ch=getchar();
  while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
  while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  return x*f;
}

void print(int x){
  if(x<0){putchar('-');x=-x;}
  if(x>9){print(x/10);putchar(x%10+'0');}
  else putchar(x+'0');
  return;
}

const int N = 15;

int n, m, dp[1<<N][N], f[N], cnt, a[N], ans;

signed main() {
  n = read(), m = read();
  For(i,0,n-1) {
    For(j,0,m-1) {
      int x = read();
      a[i] = (a[i] << 1) + x;
    }
  }
  for (int i = 0; i < 1 << m; i++) {
    f[++cnt] = i;
    for (int j = 1; j < m; j++) {
      if((i >> j & 1) && (i >> (j-1) & 1)) {
        cnt--;
        break;
      }
    }
  }
  For(i,1,cnt) {
    dp[f[i]][0] = 1; 
  } 
  for (int j = 1; j < n; j++) {
    for (int i = 1; i <= cnt; i++) {
      if((f[i] & a[j]) == f[i]) {
        for (int k = 1; k <= cnt; k++) {//上一行 
          if((f[k] & a[j]) == f[k] && ((f[k] & f[i]) == 0)) {
//            cout << dp[f[k]][j-1] << ' ';
            dp[f[i]][j] = (dp[f[i]][j] + dp[f[k]][j-1] % mod) % mod;
          }
        }
      }
    }
  }
  For(i,1,cnt) {
    ans = (ans + dp[f[i]][n-1] % mod) % mod; 
  }
  cout << ans << '\n';
  return 0;
}
/*
1 0 1 0 0 
0 1 0 0 1
*/

2023/5/27 15:42
加载中...