Cod sursa(job #3236198)

Utilizator LucaMuresanMuresan Luca Valentin LucaMuresan Data 26 iunie 2024 16:13:40
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.63 kb
#include <fstream>

std::ifstream in("invcs.in");
std::ofstream out("invcs.out");

int n;
int a[20];
int dp[1 << 20];
bool done[1 << 20];

int solve(int mask) {
  if (done[mask]) {
    return dp[mask];
  }
  dp[mask] = 0;
  int maxi = 0;
  for (int i = 0; i < n; i++) {
    if ((mask >> i) & 1) {
      if (a[i] == maxi + 1) {
        dp[mask] += solve(mask ^ (1 << i));
      }
      maxi = std::max(maxi, a[i]);
    }
  }
  done[mask] = true;
  return dp[mask];
}

int main() {
  in >> n;
  for (int i = 0; i < n; i++) {
    in >> a[i];
  }
  dp[0] = done[0] = 1;
  out << solve((1 << n) - 1);

  return 0;
}