Problem p03168 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define pb push_back
#define ers erase
#define ins insert
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define debug(x) cerr << #x << " = " << x << endl
#define kill(x) return cout << x, 0;
#define IOS                                                                    \
  ios_base::sync_with_stdio(0);                                                \
  cin.tie(0);                                                                  \
  cout.tie(0)

using namespace std;

typedef long long ll;
typedef long double ld;
typedef string str;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<ll> vl;

const ld Pi = 3.14159265359;
const ll MOD = 1000 * 1000 * 1000 + 7;
const ll MAXN = 2e3 + 10;
const ll INF = 1e18;
ld dp[MAXN][MAXN];
ld p[MAXN];
ll n;
int main() {
  IOS;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> p[i];
  }
  dp[1][0] = 1 - p[1];
  dp[1][1] = p[1];
  for (int i = 2; i <= n; i++) {
    dp[i][0] = dp[i - 1][0] * (1.0 - p[i]);
  }
  for (int i = 2; i <= n; i++) {
    for (int j = 1; j <= i; j++) {
      dp[i][j] = dp[i - 1][j] * (1 - p[i]) + dp[i - 1][j - 1] * p[i];
      // cout << i << ' ' << j << ' ';
      // cout << fixed << setprecision(20) << dp[i][j] << '\n';
    }
  }
  ld ans = 0;
  for (int i = n / 2 + 1; i <= n; i++) {
    ans += dp[n][i];
  }

  cout << fixed << setprecision(20) << ans;

  return 0;
}

/*
     ,---,           ___                 ,--,
    '  .' \        ,--.'|_             ,--.'|                             ,--,
   /  ;    '.      |  | :,'            |  | :                           ,--.'|
  ,---.        ,---, :  :       \     :  : ' :            :  : ' .--.--.   |  |,
  '   ,'\   ,-+-. /  | :  |   /\   \  .;__,'  /    ,--.--.  |  ' |     ,--.--.
  /  /    '  `--'_   /   /   | ,--.'|'   | |  :  ' ;.   : |  |   |    / \ '  | |
  /       \  |  :  /`./  ,' ,'| .   ; ,. :|   |  ,"' | |  |  ;/  \   \:__,'| :
  .--.  .-. ||  | :   .--.  .-. | |  :  ;_    '  | | '   | |: :|   | /  | | '  :
  | \  \ ,'  '  : |__  \__\/: . .'  : |__  \__\/: . .  \  \    `. |  | : '   |
  .; :|   | |  | | |  |  '  '--'    |  | '.'| ," .--.; ||  | '.'| ," .--.; |
  `----.   \'  : |_|   :    ||   | |  |/ |  :  :          ;  :    ;/  /  ,.  |;
  :    ;/  /  ,.  |  /  /`--'  /|  | '.'\   \  / |   | |--' |  | ,'          |
  ,   /;  :   .'   \  ,   /;  :   .'   \'--'.     / ;  :    ;`----'  |   |/
  `--''             ---`-' |  ,     .-./---`-' |  ,     .-./  `--'---'  |  ,   /
  '---'
                            `--`---'            `--`---'                 ---`-'
*/


Fixed submission:
#include <bits/stdc++.h>
#define pb push_back
#define ers erase
#define ins insert
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define debug(x) cerr << #x << " = " << x << endl
#define kill(x) return cout << x, 0;
#define IOS                                                                    \
  ios_base::sync_with_stdio(0);                                                \
  cin.tie(0);                                                                  \
  cout.tie(0)

using namespace std;

typedef long long ll;
typedef long double ld;
typedef string str;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<ll> vl;

const ld Pi = 3.14159265359;
const ll MOD = 1000 * 1000 * 1000 + 7;
const ll MAXN = 3e3 + 10;
const ll INF = 1e18;
ld dp[MAXN][MAXN];
ld p[MAXN];
ll n;
int main() {
  IOS;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> p[i];
  }
  dp[1][0] = 1 - p[1];
  dp[1][1] = p[1];
  for (int i = 2; i <= n; i++) {
    dp[i][0] = dp[i - 1][0] * (1.0 - p[i]);
  }
  for (int i = 2; i <= n; i++) {
    for (int j = 1; j <= i; j++) {
      dp[i][j] = dp[i - 1][j] * (1 - p[i]) + dp[i - 1][j - 1] * p[i];
      // cout << i << ' ' << j << ' ';
      // cout << fixed << setprecision(20) << dp[i][j] << '\n';
    }
  }
  ld ans = 0;
  for (int i = n / 2 + 1; i <= n; i++) {
    ans += dp[n][i];
  }

  cout << fixed << setprecision(20) << ans;

  return 0;
}

/*
     ,---,           ___                 ,--,
    '  .' \        ,--.'|_             ,--.'|                             ,--,
   /  ;    '.      |  | :,'            |  | :                           ,--.'|
  ,---.        ,---, :  :       \     :  : ' :            :  : ' .--.--.   |  |,
  '   ,'\   ,-+-. /  | :  |   /\   \  .;__,'  /    ,--.--.  |  ' |     ,--.--.
  /  /    '  `--'_   /   /   | ,--.'|'   | |  :  ' ;.   : |  |   |    / \ '  | |
  /       \  |  :  /`./  ,' ,'| .   ; ,. :|   |  ,"' | |  |  ;/  \   \:__,'| :
  .--.  .-. ||  | :   .--.  .-. | |  :  ;_    '  | | '   | |: :|   | /  | | '  :
  | \  \ ,'  '  : |__  \__\/: . .'  : |__  \__\/: . .  \  \    `. |  | : '   |
  .; :|   | |  | | |  |  '  '--'    |  | '.'| ," .--.; ||  | '.'| ," .--.; |
  `----.   \'  : |_|   :    ||   | |  |/ |  :  :          ;  :    ;/  /  ,.  |;
  :    ;/  /  ,.  |  /  /`--'  /|  | '.'\   \  / |   | |--' |  | ,'          |
  ,   /;  :   .'   \  ,   /;  :   .'   \'--'.     / ;  :    ;`----'  |   |/
  `--''             ---`-' |  ,     .-./---`-' |  ,     .-./  `--'---'  |  ,   /
  '---'
                            `--`---'            `--`---'                 ---`-'
*/