Problem p03168 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
/*#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
/*template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,
tree_order_statistics_node_update>;
*/
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<ll, ll> pl;
typedef pair<int, int> pii;

#define LOCAL 0
#define dbg(x) cout << #x << " is " << x << "\n"
#define gll(x) scanf("%d", &x)
#define gll2(x, y) scanf("%d%d", &x, &y)
#define gll3(x, y, z) scanf("%d%d%d", &x, &y, &z)
#define gllarr(arr, n) f(i, n) gll(arr[i]);
#define sz(x) ((int)x.size())
#define s(x) sort(x.begin(), x.end())
#define all(v) v.begin(), v.end()
#define rs(v)                                                                  \
  {                                                                            \
    s(v);                                                                      \
    r(v);                                                                      \
  }
#define r(v)                                                                   \
  { reverse(all(v)); }
#define pb push_back
#define f(i, n) for (int i = 0; i < n; i++)
#define fr(i, n) for (int i = n - 1; i >= 0; i--)
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define repr(i, a, b) for (int i = a; i >= b; i--)

const ll mod = (ll)1e9 + 7;
const ll inf = (ll)1e16;
const ld eps = 1e-12;
const ll N = (int)1e5 + 5;
const ll LOGN = 19;
const ld PI = 3.14159265358979323846;
inline ll mul(ll a, ll b, ll m = mod) { return (ll)(a * b) % m; }
inline ll add(ll a, ll b, ll m = mod) {
  a += b;
  if (a >= m)
    a -= m;
  if (a < 0)
    a += m;
  return a;
}
inline ll power(ll a, ll b, ll m = mod) {
  if (b == 0)
    return 1;
  if (b == 1)
    return (a % m);
  ll x = power(a, b / 2, m);
  x = mul(x, x, m);
  if (b % 2)
    x = mul(x, a, m);
  return x;
}

int n;
ld p[3002];
ld dp[3002][3002];
bool vis[3002][3002];

ld rec(int pos, int heads) {
  if (pos >= n) {
    if (heads > 0) {
      return (ld)0;
    }
    return (ld)1;
  }
  ld A = 0, B = 0;
  if (heads > 0)
    A = rec(pos + 1, heads - 1) * p[pos];
  B = rec(pos + 1, heads) * (1 - p[pos]);
  vis[pos][heads] = true;
  return dp[pos][heads] = A + B;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  if (LOCAL) {
    freopen("C:\\Users\\Dishant\\Desktop\\Collection-DEV c++\\input.txt", "r",
            stdin);
    freopen("C:\\Users\\Dishant\\Desktop\\Collection-DEV c++\\output.txt", "w",
            stdout);
  }
  cin >> n;
  f(i, n) cin >> p[i];
  memset(vis, false, sizeof(vis));
  int to = (n + 1) / 2;
  ld ans = 0;
  rep(i, to, n) ans += rec(0, i);
  cout << setprecision(10) << fixed << ans;
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
/*#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
/*template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,
tree_order_statistics_node_update>;
*/
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<ll, ll> pl;
typedef pair<int, int> pii;

#define LOCAL 0
#define dbg(x) cout << #x << " is " << x << "\n"
#define gll(x) scanf("%d", &x)
#define gll2(x, y) scanf("%d%d", &x, &y)
#define gll3(x, y, z) scanf("%d%d%d", &x, &y, &z)
#define gllarr(arr, n) f(i, n) gll(arr[i]);
#define sz(x) ((int)x.size())
#define s(x) sort(x.begin(), x.end())
#define all(v) v.begin(), v.end()
#define rs(v)                                                                  \
  {                                                                            \
    s(v);                                                                      \
    r(v);                                                                      \
  }
#define r(v)                                                                   \
  { reverse(all(v)); }
#define pb push_back
#define f(i, n) for (int i = 0; i < n; i++)
#define fr(i, n) for (int i = n - 1; i >= 0; i--)
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define repr(i, a, b) for (int i = a; i >= b; i--)

const ll mod = (ll)1e9 + 7;
const ll inf = (ll)1e16;
const ld eps = 1e-12;
const ll N = (int)1e5 + 5;
const ll LOGN = 19;
const ld PI = 3.14159265358979323846;
inline ll mul(ll a, ll b, ll m = mod) { return (ll)(a * b) % m; }
inline ll add(ll a, ll b, ll m = mod) {
  a += b;
  if (a >= m)
    a -= m;
  if (a < 0)
    a += m;
  return a;
}
inline ll power(ll a, ll b, ll m = mod) {
  if (b == 0)
    return 1;
  if (b == 1)
    return (a % m);
  ll x = power(a, b / 2, m);
  x = mul(x, x, m);
  if (b % 2)
    x = mul(x, a, m);
  return x;
}

int n;
ld p[3002];
ld dp[3002][3002];
bool vis[3002][3002];

ld rec(int pos, int heads) {
  if (pos >= n) {
    if (heads > 0) {
      return (ld)0;
    }
    return (ld)1;
  }
  if (vis[pos][heads])
    return dp[pos][heads];
  ld A = 0, B = 0;
  if (heads > 0)
    A = rec(pos + 1, heads - 1) * p[pos];
  B = rec(pos + 1, heads) * (1 - p[pos]);
  vis[pos][heads] = true;
  return dp[pos][heads] = A + B;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  if (LOCAL) {
    freopen("C:\\Users\\Dishant\\Desktop\\Collection-DEV c++\\input.txt", "r",
            stdin);
    freopen("C:\\Users\\Dishant\\Desktop\\Collection-DEV c++\\output.txt", "w",
            stdout);
  }
  cin >> n;
  f(i, n) cin >> p[i];
  memset(vis, false, sizeof(vis));
  int to = (n + 1) / 2;
  ld ans = 0;
  rep(i, to, n) ans += rec(0, i);
  cout << setprecision(10) << fixed << ans;
  return 0;
}