Problem p03174 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <bitset>
#include <climits>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

#define rep(i, m, n) for (int i = int(m); i < int(n); i++)
#define all(c) begin(c), end(c)

template <typename T1, typename T2> inline void chmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}

template <typename T1, typename T2> inline void chmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}

// 改造
typedef long long int ll;
using namespace std;
#define INF (1 << 30) - 1
#define INFl (ll)5e15
#define DEBUG 0 // デバッグする時1にしてね
#define dump(x) cerr << #x << " = " << (x) << endl
#define MOD 1000000007

// ここから編集する
class Solve {
public:
  void input() {}

  void solve() {
    input();
    int N;
    cin >> N;
    vector<vector<int>> a(N, vector<int>(N));
    rep(i, 0, N) rep(j, 0, N) cin >> a[i][j];

    vector<vector<ll>> dp(N, vector<ll>(1 << N));

    // 男性0の組み合わせ
    for (int j = 0; j < N; ++j) {
      if (a[0][j]) {
        dp[0][1 << j] = 1;
      }
    }
    // 男性1~N-1
    for (int i = 0; i + 1 < N; ++i) {
      for (int bit = 0; bit < 1 << N; ++bit) {
        for (int j = 0; j < N; ++j) {
          if (!(bit >> j & 1) && a[i + 1][j]) {
            (dp[i + 1][bit | (1 << j)] += dp[i][bit]) %= MOD;
          }
        }
      }
    }

    ll ans = dp[N - 1][(1 << N) - 1];
    cout << ans << endl;
  }
};

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  Solve().solve();

  return 0;
}


Fixed submission:
#include <algorithm>
#include <bitset>
#include <climits>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

#define rep(i, m, n) for (int i = int(m); i < int(n); i++)
#define all(c) begin(c), end(c)

template <typename T1, typename T2> inline void chmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}

template <typename T1, typename T2> inline void chmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}

// 改造
typedef long long int ll;
using namespace std;
#define INF (1 << 30) - 1
#define INFl (ll)5e15
#define DEBUG 0 // デバッグする時1にしてね
#define dump(x) cerr << #x << " = " << (x) << endl
#define MOD 1000000007

// ここから編集する
class Solve {
public:
  void input() {}

  void solve() {
    input();
    int N;
    cin >> N;
    vector<vector<int>> a(N, vector<int>(N));
    rep(i, 0, N) rep(j, 0, N) cin >> a[i][j];

    vector<vector<ll>> dp(N, vector<ll>(1 << N));

    // 男性0の組み合わせ
    for (int j = 0; j < N; ++j) {
      if (a[0][j]) {
        dp[0][1 << j] = 1;
      }
    }
    // 男性1~N-1
    for (int i = 0; i + 1 < N; ++i) {
      for (int bit = 0; bit < 1 << N; ++bit) {
        int cnt = 0;
        for (int j = 0; j < N; ++j) {
          if (bit >> j & 1)
            cnt++;
        }

        if (i + 1 != cnt)
          continue;

        for (int j = 0; j < N; ++j) {
          if (!(bit >> j & 1) && a[i + 1][j]) {
            (dp[i + 1][bit | (1 << j)] += dp[i][bit]) %= MOD;
          }
        }
      }
    }

    ll ans = dp[N - 1][(1 << N) - 1];
    cout << ans << endl;
  }
};

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  Solve().solve();

  return 0;
}