POJ 2441 : Arrange the Bulls

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;
}