Problem p01350 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <algorithm>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <set>
#include <vector>

using namespace std;
typedef long long ll;

typedef double R;
typedef complex<R> P;

const R EPS = 1e-10;
const R INF = 1e9;
const R PI = acos((R)(-1));

//?§???????[0, 2*PI)???
R radNorP(R x) { return fmod(fmod(x, 2 * PI) + 2 * PI, 2 * PI); }

//?§???????[-PI, PI)???
R radNorN(R x) {
  x = radNorP(x);
  if (x >= PI)
    x -= 2 * PI;
  return x;
}

R deg2rad(R x) { return x / 180 * PI; }

int n;
R r, th;
P p[22];

R dp[22][22][10100];
R g[22][22][22];
int main() {
  cin >> n;
  cin >> r >> th;
  th = deg2rad(th);
  for (int i = 0; i < n; i++) {
    R x, y;
    cin >> x >> y;
    p[i] = P(x, y);
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      for (int k = 0; k < n; k++) {
        g[i][j][k] = INF;
        if (i == j || j == k)
          continue;
        R u = arg(p[j] - p[i]) - arg(p[k] - p[j]);
        u = abs(radNorN(u));
        if (u >= th)
          continue;
        g[i][j][k] = abs(p[k] - p[j]);
        //                printf("%d %d %d %Lf %Lf\\n", i, j, k, u, g[i][j][k]);
      }
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      dp[i][j][1] = INF;
      if (i != 0)
        continue;
      if (j == 0)
        continue;
      dp[0][j][1] = abs(p[j] - p[i]);
    }
  }
  for (int s = 2; s < 10100; s++) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        dp[i][j][s] = INF;
        for (int k = 0; k < n; k++) {
          dp[i][j][s] = min(dp[i][j][s], dp[k][i][s - 1] + g[k][i][j]);
        }
      }
    }
  }
  int res = 0;
  for (int s = 1; s < 10100; s++) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if (dp[i][j][s] < r)
          res = max(res, s);
      }
    }
  }
  cout << res << endl;
  return 0;
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <set>
#include <vector>

using namespace std;
typedef long long ll;

typedef long double R;
typedef complex<R> P;

const R EPS = 1e-10;
const R INF = 1e9;
const R PI = acos((R)(-1));

//?§???????[0, 2*PI)???
R radNorP(R x) { return fmod(fmod(x, 2 * PI) + 2 * PI, 2 * PI); }

//?§???????[-PI, PI)???
R radNorN(R x) {
  x = radNorP(x);
  if (x >= PI)
    x -= 2 * PI;
  return x;
}

R deg2rad(R x) { return x / 180 * PI; }

int n;
R r, th;
P p[22];

R dp[22][22][10100];
R g[22][22][22];
int main() {
  cin >> n;
  cin >> r >> th;
  th = deg2rad(th);
  for (int i = 0; i < n; i++) {
    R x, y;
    cin >> x >> y;
    p[i] = P(x, y);
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      for (int k = 0; k < n; k++) {
        g[i][j][k] = INF;
        if (i == j || j == k)
          continue;
        R u = arg(p[j] - p[i]) - arg(p[k] - p[j]);
        u = abs(radNorN(u));
        if (u >= th)
          continue;
        g[i][j][k] = abs(p[k] - p[j]);
        //                printf("%d %d %d %Lf %Lf\\n", i, j, k, u, g[i][j][k]);
      }
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      dp[i][j][1] = INF;
      if (i != 0)
        continue;
      if (j == 0)
        continue;
      dp[0][j][1] = abs(p[j] - p[i]);
    }
  }
  for (int s = 2; s < 10100; s++) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        dp[i][j][s] = INF;
        for (int k = 0; k < n; k++) {
          dp[i][j][s] = min(dp[i][j][s], dp[k][i][s - 1] + g[k][i][j]);
        }
      }
    }
  }
  int res = 0;
  for (int s = 1; s < 10100; s++) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if (dp[i][j][s] < r)
          res = max(res, s);
      }
    }
  }
  cout << res << endl;
  return 0;
}