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

#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

using namespace std;
using namespace placeholders;

typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
typedef vector<string> VS;
typedef stringstream SS;
typedef pair<int, int> PII;
typedef vector<pair<int, int>> VPII;
#define VT(T) vector<T>
#define VVT(T) vector<vector<T>>
#define LIM(T) numeric_limits<T>

template <typename T> inline istream &operator>>(istream &s, vector<T> &v) {
  for (T &t : v) {
    s >> t;
  }
  return s;
}
template <typename T>
inline ostream &operator<<(ostream &s, const vector<T> &v) {
  for (int i = 0; i < int(v.size()); ++i) {
    s << (" " + !i) << v[i];
  }
  return s;
}
template <typename T> inline T fromString(const string &s) {
  T res;
  istringstream iss(s);
  iss >> res;
  return res;
};
template <typename T> inline string toString(const T &a) {
  ostringstream oss;
  oss << a;
  return oss.str();
};

#define REP2(i, n) REP3(i, 0, n)
#define REP3(i, m, n) for (int i = (int)(m); i < (int)(n); ++i)
#define GET_REP(a, b, c, F, ...) F
#define REP(...) GET_REP(__VA_ARGS__, REP3, REP2)(__VA_ARGS__)
#define FOR(e, c) for (auto &e : c)
#define ALL(c) (c).begin(), (c).end()
#define AALL(a, t) (t *)a, (t *)a + sizeof(a) / sizeof(t)
#define DRANGE(c, p) (c).begin(), (c).begin() + p, (c).end()

#define SZ(v) ((int)(v).size())
#define PB push_back
#define EM emplace
#define EB emplace_back
#define BI back_inserter

#define EXIST(c, e) ((c).find(e) != (c).end())

#define MP make_pair
#define fst first
#define snd second

#define DUMP(x) cerr << #x << " = " << (x) << endl

#include <complex>
typedef complex<double> Point;
constexpr double EPS = 1e-8;
const double PI = acos(-1);
constexpr Point O(0, 0);

// 入力ストリームから実数二つをとって Point へ
istream &operator>>(istream &s, Point &a) {
  double r, i;
  s >> r >> i;
  a = Point(r, i);
  return s;
}

double dp[10001][20][20];
double dists[20][20];
bool movable[20][20][20];

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int N;
  cin >> N;

  double R, THETA;
  cin >> R >> THETA;

  THETA = THETA / 360 * 2 * PI;

  VT(Point) ps(N);
  cin >> ps;

  REP(i, N) {
    REP(j, i) { dists[i][j] = dists[j][i] = abs(ps[i] - ps[j]); }
  }
  REP(i, N) {
    REP(j, N) {
      REP(k, N) {
        if (i == j || i == k || j == k) {
          continue;
        }

        movable[i][j][k] =
            abs(arg((ps[k] - ps[j]) / (ps[j] - ps[i]))) <= THETA + EPS;
      }
    }
  }

  fill(AALL(dp, double), R * 2);
  dp[0][0][0] = 0;
  REP(i, 10000) {
    REP(j, N) {
      REP(k, N) {
        REP(l, N) {
          if (j == l || (i && !movable[k][j][l])) {
            continue;
          }

          dp[i + 1][l][j] = min(dp[i + 1][l][j], dp[i][j][k] + dists[j][l]);
        }
      }
    }
  }

  int res = 0;
  REP(i, 10001) {
    REP(j, N) {
      REP(k, N) {
        if (dp[i][j][k] <= R + EPS) {
          res = max(res, i);
        }
      }
    }
  }
  cout << res << endl;

  return 0;
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

using namespace std;
using namespace placeholders;

typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
typedef vector<string> VS;
typedef stringstream SS;
typedef pair<int, int> PII;
typedef vector<pair<int, int>> VPII;
#define VT(T) vector<T>
#define VVT(T) vector<vector<T>>
#define LIM(T) numeric_limits<T>

template <typename T> inline istream &operator>>(istream &s, vector<T> &v) {
  for (T &t : v) {
    s >> t;
  }
  return s;
}
template <typename T>
inline ostream &operator<<(ostream &s, const vector<T> &v) {
  for (int i = 0; i < int(v.size()); ++i) {
    s << (" " + !i) << v[i];
  }
  return s;
}
template <typename T> inline T fromString(const string &s) {
  T res;
  istringstream iss(s);
  iss >> res;
  return res;
};
template <typename T> inline string toString(const T &a) {
  ostringstream oss;
  oss << a;
  return oss.str();
};

#define REP2(i, n) REP3(i, 0, n)
#define REP3(i, m, n) for (int i = (int)(m); i < (int)(n); ++i)
#define GET_REP(a, b, c, F, ...) F
#define REP(...) GET_REP(__VA_ARGS__, REP3, REP2)(__VA_ARGS__)
#define FOR(e, c) for (auto &e : c)
#define ALL(c) (c).begin(), (c).end()
#define AALL(a, t) (t *)a, (t *)a + sizeof(a) / sizeof(t)
#define DRANGE(c, p) (c).begin(), (c).begin() + p, (c).end()

#define SZ(v) ((int)(v).size())
#define PB push_back
#define EM emplace
#define EB emplace_back
#define BI back_inserter

#define EXIST(c, e) ((c).find(e) != (c).end())

#define MP make_pair
#define fst first
#define snd second

#define DUMP(x) cerr << #x << " = " << (x) << endl

#include <complex>
typedef complex<double> Point;
constexpr double EPS = 1e-8;
const double PI = acos(-1);
constexpr Point O(0, 0);

// 入力ストリームから実数二つをとって Point へ
istream &operator>>(istream &s, Point &a) {
  double r, i;
  s >> r >> i;
  a = Point(r, i);
  return s;
}

double dp[16384][32][32];
double dists[32][32];
bool movable[32][32][32];

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int N;
  cin >> N;

  double R, THETA;
  cin >> R >> THETA;

  THETA = THETA / 360 * 2 * PI;

  VT(Point) ps(N);
  cin >> ps;

  REP(i, N) {
    REP(j, i) { dists[i][j] = dists[j][i] = abs(ps[i] - ps[j]); }
  }
  REP(i, N) {
    REP(j, N) {
      REP(k, N) {
        if (i == j || i == k || j == k) {
          continue;
        }

        movable[i][j][k] =
            abs(arg((ps[k] - ps[j]) / (ps[j] - ps[i]))) <= THETA + EPS;
      }
    }
  }

  fill(AALL(dp, double), R * 2);
  dp[0][0][0] = 0;
  REP(i, 10000) {
    REP(j, N) {
      REP(k, N) {
        REP(l, N) {
          if (i && !movable[k][j][l]) {
            continue;
          }

          dp[i + 1][l][j] = min(dp[i + 1][l][j], dp[i][j][k] + dists[j][l]);
        }
      }
    }
  }

  int res = 0;
  REP(i, 10001) {
    REP(j, N) {
      REP(k, N) {
        if (dp[i][j][k] <= R + EPS) {
          res = max(res, i);
        }
      }
    }
  }
  cout << res << endl;

  return 0;
}