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

#include <bits/stdc++.h>
using namespace std;
#define FOR(i, k, n) for (int i = (k); i < (n); i++)
#define REP(i, n) FOR(i, 0, n)
#define ALL(a) a.begin(), a.end()
#define MS(m, v) memset(m, v, sizeof(m))
#define D10 fixed << setprecision(10)
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<string> vs;
typedef pair<int, int> pii;
const int MOD = 1000000007;
const int INF = MOD + 1;
const ld EPS = 1e-12;
template <class T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <class T> T &chmax(T &a, const T &b) { return a = max(a, b); }

/*--------------------template--------------------*/

typedef long double ld;
const ld PI = acos(-1.0);
bool eq(ld a, ld b) { return abs(a - b) < EPS; }
typedef complex<ld> Point;
typedef vector<Point> Polygon;

ld dot(Point a, Point b) { return real(conj(a) * b); }

double dp[22][22][11111], dist[22][22][22];
int main() {
  int n;
  ld r, th;
  cin >> n >> r >> th;
  vector<Point> ps;
  REP(i, n) {
    ld x, y;
    cin >> x >> y;
    ps.emplace_back(x, y);
  }
  REP(i, n) REP(j, n) REP(k, n) {
    Point pre = ps[i], now = ps[j], next = ps[k];
    Point v1 = now - pre, v2 = next - now;
    if (i == j || j == k || i == k) {
      dist[i][j][k] = INF;
    } else {
      ld lhs = dot(v1, v2), rhs = abs(v1) * abs(v2) * cos(th / 180.0 * PI);
      if (lhs - rhs > -EPS)
        dist[i][j][k] = abs(v2);
      else
        dist[i][j][k] = INF;
    }
  }
  REP(i, 22) REP(j, 22) REP(k, 11111) dp[i][j][k] = INF;
  dp[0][0][0] = 0;
  FOR(i, 1, n) dp[0][i][1] = abs(ps[i] - ps[0]);
  FOR(k, 1, 11111) REP(i, n) REP(j, n) {
    REP(l, n) {
      if (dist[i][j][l] == INF)
        continue;
      else
        chmin(dp[j][l][k + 1], dp[i][j][k] + dist[i][j][l]);
    }
  }
  int ans = 0;
  REP(i, 22) REP(j, 22) REP(k, 11111) {
    if (dp[i][j][k] <= r)
      chmax(ans, k);
  }
  cout << ans << endl;
  return 0;
}

Error: MLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define FOR(i, k, n) for (int i = (k); i < (n); i++)
#define REP(i, n) FOR(i, 0, n)
#define ALL(a) a.begin(), a.end()
#define MS(m, v) memset(m, v, sizeof(m))
#define D10 fixed << setprecision(10)
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<string> vs;
typedef pair<int, int> pii;
const int MOD = 1000000007;
const int INF = MOD + 1;
const ld EPS = 1e-12;
template <class T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <class T> T &chmax(T &a, const T &b) { return a = max(a, b); }

/*--------------------template--------------------*/

typedef long double ld;
const ld PI = acos(-1.0);
bool eq(ld a, ld b) { return abs(a - b) < EPS; }
typedef complex<ld> Point;
typedef vector<Point> Polygon;

ld dot(Point a, Point b) { return real(conj(a) * b); }

ld dp[22][22][11111], dist[22][22][22];
int main() {
  int n;
  ld r, th;
  cin >> n >> r >> th;
  vector<Point> ps;
  REP(i, n) {
    ld x, y;
    cin >> x >> y;
    ps.emplace_back(x, y);
  }
  REP(i, n) REP(j, n) REP(k, n) {
    Point pre = ps[i], now = ps[j], next = ps[k];
    Point v1 = now - pre, v2 = next - now;
    if (i == j || j == k || i == k) {
      dist[i][j][k] = INF;
    } else {
      ld lhs = dot(v1, v2), rhs = abs(v1) * abs(v2) * cos(th / 180.0 * PI);
      if (lhs - rhs > -EPS)
        dist[i][j][k] = abs(v2);
      else
        dist[i][j][k] = INF;
    }
  }
  REP(i, 22) REP(j, 22) REP(k, 11111) dp[i][j][k] = INF;
  dp[0][0][0] = 0;
  FOR(i, 1, n) dp[0][i][1] = abs(ps[i] - ps[0]);
  FOR(k, 1, 11111) REP(i, n) REP(j, n) {
    REP(l, n) {
      if (dist[i][j][l] == INF)
        continue;
      else
        chmin(dp[j][l][k + 1], dp[j][l][k] + dist[i][j][l]);
    }
  }
  int ans = 0;
  REP(i, 22) REP(j, 22) REP(k, 1111) {
    if (dp[i][j][k] <= r)
      chmax(ans, k);
  }
  cout << ans << endl;
  return 0;
}