何度も曲がるのは最適でない。
最初に前進を全て使った後、いくらか曲がって後進を使う。
余弦定理が出てこなくて少し焦った。
class TurtleSpy { public: double maxDistance(vector <string> C) { vector<int> A; double F = 0; double B = 0; for (int i = 0; i < (int)C.size(); ++i) { istringstream iss(C[i]); string c; int n; iss >> c >> n; if (c[0] == 'f') F += n; if (c[0] == 'b') B += n; if (c[0] == 'l') A.push_back(n); if (c[0] == 'r') A.push_back(360 - n); } const int N = A.size() + 1; const int M = 360 + 1; bool dp[N][M]; fill(&dp[0][0], &dp[N - 1][M], false); dp[0][0] = true; for (int i = 0; i < (int)A.size(); ++i) { for (int j = 0; j < (int)M; ++j) { if (dp[i][j]) { dp[i + 1][j] = true; dp[i + 1][(j + A[i]) % 360] = true; } } } double mx = 0; for (int i = 0; i < (int)M; ++i) { if (!dp[A.size()][i]) continue; double a = M_PI / 180.0 * i; double d = F * F + B * B - 2.0 * F * B * cos(a); mx = max(mx, sqrt(d)); } return mx; } };