POJ 2441 : Arrange the Bulls
通ったんだけどこれでいいのかな。。
int N, M; int cows[30][30] = {}; int memo[(1 << 20) + 1] = {}; int solve(int i, int S) { if (memo[S] != -1) { return memo[S]; } if (i == N) return 1; int res = 0; for (int j = 0; j < M; j++) { if (cows[i][j] && !(S & (1 << j))) { res += solve(i+1, S | (1 << j)); } } return memo[S] = res; } int main() { memset(memo, -1, sizeof(memo)); cin >> N >> M; for (int i = 0; i < N; i++) { int t; cin >> t; for (int j = 0; j < t; j++) { int t2; cin >> t2; t2--; cows[i][t2] = 1; } } cout << solve(0, 0) << endl; return 0; }