何度も曲がるのは最適でない。
最初に前進を全て使った後、いくらか曲がって後進を使う。
余弦定理が出てこなくて少し焦った。
- 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;
- }
- };