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

#include <bits/stdc++.h>
using namespace std;

struct point {
  double x, y;
};

double INF = 1e9;
double PI = acos(-1);
double EPS = (1e-10);
double dp[10001][20][20];
int n;
double Ti;
double r, ti;
point t[20];

double mem[20][20][20];
double check(int to, int from, int prev) {
  if (mem[to][from][prev] != -INF)
    return mem[to][from][prev];

  if (to == from || to == prev)
    return INF;
  double vax = t[to].x - t[from].x;
  double vay = t[to].y - t[from].y;
  double vbx = t[from].x - t[prev].x;
  double vby = t[from].y - t[prev].y;
  double ar = (vax * vbx + vay * vby) /
              (sqrt(vax * vax + vay * vay) * sqrt(vbx * vbx + vby * vby));
  ar = acos(ar);
  if (ar < ti + EPS) {
    mem[to][from][prev] = sqrt(vax * vax + vay * vay);
  } else {
    mem[to][from][prev] = INF;
  }
  return mem[to][from][prev];
}

void solve(int i, int j, int k) {
  for (int to = 0; to < n; to++) {
    dp[i + 1][to][j] = min(dp[i + 1][to][j], dp[i][j][k] + check(to, j, k));

    // dp[i][j][k]+sqrt(vax*vax+vay*vay));
    //     if(ar<ti+EPS){
    //  dp[i+1][to][j]=min(dp[i+1][to][j],dp[i][j][k]+sqrt(vax*vax+vay*vay));
    //     }
  }
}

int main() {

  for (int i = 0; i < 10001; i++)
    for (int j = 0; j < 20; j++)
      for (int k = 0; k < 20; k++)
        dp[i][j][k] = INF;

  for (int i = 0; i < 20; i++)
    for (int j = 0; j < 20; j++)
      for (int k = 0; k < 20; k++)
        mem[i][j][k] = -INF;

  cin >> n >> r >> Ti;
  ti = Ti / 360.0 * 2.0 * PI;

  for (int i = 0; i < n; i++)
    cin >> t[i].x >> t[i].y;

  for (int i = 1; i < n; i++) {
    double x = t[i].x - t[0].x;
    double y = t[i].y - t[0].y;
    dp[1][i][0] = sqrt(x * x + y * y);
  }

  int ans = 0;
  for (int i = 1; i <= 10000; i++) {
    for (int j = 0; j < n; j++) {
      for (int k = 0; k < n; k++) {
        if (dp[i][j][k] > r + EPS)
          continue;
        ans = max(ans, i);
        solve(i, j, k);
      }
    }
  }
  cout << ans << endl;

  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

struct point {
  double x, y;
};

double INF = 1e9;
double PI = acos(-1);
double EPS = (1e-10);
double dp[10001][20][20];
int n;
double Ti;
double r, ti;
point t[20];

void solve(int i, int j, int k) {
  for (int to = 0; to < n; to++) {
    if (to == j || to == k)
      continue;
    double vax = t[to].x - t[j].x;
    double vay = t[to].y - t[j].y;
    double vbx = t[j].x - t[k].x;
    double vby = t[j].y - t[k].y;
    double ar = (vax * vbx + vay * vby) /
                (sqrt(vax * vax + vay * vay) * sqrt(vbx * vbx + vby * vby));
    ar = acos(ar);
    if (ar < ti + EPS) {
      dp[i + 1][to][j] =
          min(dp[i + 1][to][j], dp[i][j][k] + sqrt(vax * vax + vay * vay));
    }
  }
}

int main() {

  for (int i = 0; i < 10001; i++)
    for (int j = 0; j < 20; j++)
      for (int k = 0; k < 20; k++)
        dp[i][j][k] = INF;

  cin >> n >> r >> Ti;
  ti = Ti / 360.0 * 2.0 * PI;

  for (int i = 0; i < n; i++)
    cin >> t[i].x >> t[i].y;

  for (int i = 1; i < n; i++) {
    double x = t[i].x - t[0].x;
    double y = t[i].y - t[0].y;
    dp[1][i][0] = sqrt(x * x + y * y);
  }

  int ans = 0;
  for (int i = 1; i <= 10000; i++) {
    for (int j = 0; j < n; j++) {
      for (int k = 0; k < n; k++) {
        if (dp[i][j][k] > r + EPS)
          continue;
        ans = max(ans, i);
        solve(i, j, k);
      }
    }
  }
  cout << ans << endl;

  return 0;
}