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

/*
 * carrot_tour.cpp
 *
 *  Created on: 2017/05/30
 *      Author: Nishio
 */
#include <bits/stdc++.h>
#define REP(i, n, N) for (int i = (n); i < (int)(N); i++)
#define p(s) cout << (s) << endl;
#define F first
#define S second
typedef long long ll;
using namespace std;

const int ctinf = 1e5;
double dp[10000][21][21]; // num,prev,now = minr

double vec_len(int x1, int x2, int y1, int y2) {
  return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}

int dot_pro(int x1, int x2, int x3, int y1, int y2, int y3) {
  return (x2 - x1) * (x3 - x2) + (y2 - y1) * (y3 - y2);
}

double ctcos(int x1, int x2, int x3, int y1, int y2, int y3) {
  return dot_pro(x1, x2, x3, y1, y2, y3) /
         (vec_len(x1, x2, y1, y2) * vec_len(x2, x3, y2, y3));
}
int main() {
  int n;
  double r, theta;
  cin >> n >> r >> theta;
  REP(i, 0, r) REP(j, 0, 21) REP(k, 0, 21) dp[i][j][k] = ctinf;
  double co = cos(theta * M_PI / 180.0);
  int x[20], y[20];
  REP(i, 0, n) cin >> x[i] >> y[i];
  int ans = 0;
  vector<int> ok[21][21];
  REP(prev, 0, n) REP(now, 0, n) {
    if (prev == now)
      continue;
    REP(next, 0, n) {
      if (prev == next || now == next)
        continue;
      if (ctcos(x[prev], x[now], x[next], y[prev], y[now], y[next]) < co)
        continue;
      ok[prev][now].push_back(next);
    }
  }
  REP(i, 1, n) if (vec_len(x[0], x[i], y[0], y[i]) < r) {
    dp[1][0][i] = vec_len(x[0], x[i], y[0], y[i]);
    ans = 1;
  }
  // int from,to;

  REP(i, 2, r) {
    REP(prev, 0, n) {
      REP(now, 0, n) {
        if (prev == now)
          continue;
        for (auto next : ok[prev][now]) {
          if (dp[i - 1][prev][now] +
                  vec_len(x[now], x[next], y[now], y[next]) <=
              r) {
            dp[i][now][next] =
                min(dp[i][now][next],
                    dp[i - 1][prev][now] +
                        vec_len(x[now], x[next], y[now], y[next]));
            ans = i;
          }
        }
      }
    }
  }
  p(ans);
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define REP(i, n, N) for (int i = (n); i < (int)(N); i++)
#define p(s) cout << (s) << endl;
using namespace std;

const int ctinf = 1e5;
double dp[10000][21][21]; // num,prev,now = minr

double vec_len(int x1, int x2, int y1, int y2) {
  return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}

int dot_pro(int x1, int x2, int x3, int y1, int y2, int y3) {
  return (x2 - x1) * (x3 - x2) + (y2 - y1) * (y3 - y2);
}

double ctcos(int x1, int x2, int x3, int y1, int y2, int y3) {
  return dot_pro(x1, x2, x3, y1, y2, y3) /
         (vec_len(x1, x2, y1, y2) * vec_len(x2, x3, y2, y3));
}
int main() {
  int n;
  double r, theta;
  cin >> n >> r >> theta;
  REP(i, 0, r) REP(j, 0, 21) REP(k, 0, 21) dp[i][j][k] = ctinf;
  double co = cos(theta * M_PI / 180.0);
  int x[20], y[20];
  REP(i, 0, n) cin >> x[i] >> y[i];
  int ans = 0;
  REP(i, 1, n) if (vec_len(x[0], x[i], y[0], y[i]) < r) {
    dp[1][0][i] = vec_len(x[0], x[i], y[0], y[i]);
    ans = 1;
  }
  // int from,to;

  REP(i, 2, r) {
    REP(prev, 0, n) {
      REP(now, 0, n) {
        REP(next, 0, n) {
          if (prev == now || prev == next || now == next)
            continue;
          if (ctcos(x[prev], x[now], x[next], y[prev], y[now], y[next]) < co)
            continue;
          if (dp[i - 1][prev][now] +
                  vec_len(x[now], x[next], y[now], y[next]) <=
              r) {
            dp[i][now][next] =
                min(dp[i][now][next],
                    dp[i - 1][prev][now] +
                        vec_len(x[now], x[next], y[now], y[next]));
            ans = i;
          }
        }
      }
    }
  }
  p(ans);
  return 0;
}