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

#include <cmath>
#include <iostream>
#include <queue>
#define REP(i, a, n) for (int i = (a); i < (n); i++)
using namespace std;

struct state {
  int p, c, n;
  float d;
  bool operator<(const state &s) const { return d > s.d; }
};

int N, X[20], Y[20];
float R, Theta;
float d[20][20];
bool angle[20][20][20];
float dp[20][20][10000];

float theta(int i, int j, int k) {
  int x1 = X[k] - X[j], y1 = Y[k] - Y[j];
  int x2 = X[j] - X[i], y2 = Y[j] - Y[i];
  float l1 = sqrt(x1 * x1 + y1 * y1);
  float l2 = sqrt(x2 * x2 + y2 * y2);
  float iprod = x1 * x2 + y1 * y2;
  float rad = acos(iprod / l1 / l2);
  return rad * 180 / M_PI;
}

int main(void) {
  cin >> N >> R >> Theta;
  REP(i, 0, N) cin >> X[i] >> Y[i];

  REP(i, 0, N) REP(j, 0, N) {
    d[i][j] =
        sqrt((X[i] - X[j]) * (X[i] - X[j]) + (Y[i] - Y[j]) * (Y[i] - Y[j]));
  }
  REP(i, 0, N) REP(j, 0, N) REP(k, 0, N) {
    if (i == j || j == k || k == i)
      angle[i][j][k] = false;
    else
      angle[i][j][k] = theta(i, j, k) <= Theta + 10e-8;
  }

  REP(i, 0, N) REP(j, 0, N) REP(k, 0, 10000) dp[i][j][k] = 1e10;

  priority_queue<state> q;
  REP(i, 1, N) if (d[0][i] <= R + 1e-8) q.push((state){0, i, 1, d[0][i]});

  int ans = 0;
  while (q.size()) {
    state c = q.top();
    q.pop();

    if (dp[c.p][c.c][c.n] <= c.d)
      continue;
    dp[c.p][c.c][c.n] = c.d;

    ans = max(ans, c.n);

    REP(i, 0, N) if (angle[c.p][c.c][i]) {
      float nd = c.d + d[c.c][i];
      if (dp[c.c][i][c.n + 1] <= nd)
        continue;
      if (nd <= R + 1e-8)
        q.push((state){c.c, i, c.n + 1, nd});
    }
  }

  cout << ans << endl;

  return 0;
}

Error: MLE

Fixed submission:

#include <cmath>
#include <iostream>
#include <queue>
#define REP(i, a, n) for (int i = (a); i < (n); i++)
using namespace std;

struct state {
  int p, c, n;
  float d;
  bool operator<(const state &s) const { return d > s.d; }
};

int N, X[20], Y[20];
float R, Theta;
float d[20][20];
bool angle[20][20][20];
float dp[20][20][100000];

float theta(int i, int j, int k) {
  int x1 = X[k] - X[j], y1 = Y[k] - Y[j];
  int x2 = X[j] - X[i], y2 = Y[j] - Y[i];
  float l1 = sqrt(x1 * x1 + y1 * y1);
  float l2 = sqrt(x2 * x2 + y2 * y2);
  float iprod = x1 * x2 + y1 * y2;
  float rad = acos(iprod / l1 / l2);
  return rad * 180 / M_PI;
}

int main(void) {
  cin >> N >> R >> Theta;
  REP(i, 0, N) cin >> X[i] >> Y[i];

  REP(i, 0, N) REP(j, 0, N) {
    d[i][j] =
        sqrt((X[i] - X[j]) * (X[i] - X[j]) + (Y[i] - Y[j]) * (Y[i] - Y[j]));
  }
  REP(i, 0, N) REP(j, 0, N) REP(k, 0, N) {
    if (i == j || j == k || k == i)
      angle[i][j][k] = false;
    else
      angle[i][j][k] = theta(i, j, k) <= Theta + 10e-8;
  }

  REP(i, 0, N) REP(j, 0, N) REP(k, 0, 100000) dp[i][j][k] = 1e10;

  priority_queue<state> q;
  REP(i, 1, N) if (d[0][i] <= R + 1e-8) q.push((state){0, i, 1, d[0][i]});

  int ans = 0;
  while (q.size()) {
    state c = q.top();
    q.pop();

    if (dp[c.p][c.c][c.n] <= c.d)
      continue;
    dp[c.p][c.c][c.n] = c.d;

    ans = max(ans, c.n);

    REP(i, 0, N) if (angle[c.p][c.c][i]) {
      float nd = c.d + d[c.c][i];
      if (dp[c.c][i][c.n + 1] <= nd)
        continue;
      if (nd <= R + 1e-8)
        q.push((state){c.c, i, c.n + 1, nd});
    }
  }

  cout << ans << endl;

  return 0;
}