状态压缩裸题
https://atcoder.jp/contests/dp/tasks/dp_o
#include <bits/stdc++.h>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
const int mod = 1e9 + 7;
const int maxn = (1<<21) + 5;
int dp[30][maxn];
int a[30][30], b[30];
vector<int> can[30];
int main() {
freopen("in.in", "r", stdin);
int n;
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
b[i] += (1<<j)*a[i][j];
}
}
for (int i = 1; i < (1<<n); i++) {
if ((i | b[0]) == b[0]) {
dp[0][i] = 1;
}
}
for (int i = 1; i < n; i++) {
for (int j = 0; j < n; j++) { //当前状态
if (!a[i][j]) continue;
int x = 1<<j;
for (int k = 1; k < (1<<n); k++) { //前一个转态
if((x & k) != 0 || !dp[i - 1][k]) continue;
dp[i][x | k] += dp[i - 1][k];
dp[i][x | k] %= mod;
}
}
}
cout << dp[n - 1][(1<<n) - 1] << endl;
return 0;
} 
京公网安备 11010502036488号