int doBest(int left, int right, int player) {
int& ret = cache[left][right][player];
if (isCacheFilled[left][right][player]) return ret;
int case1[2] = {left + 1, right};
int case2[2] = {left , right - 1};
int case3[2] = {left + 2, right};
int case4[2] = {left , right - 2};
ret = max(
- doBest(case1[0], case1[1], !player) + numbers[left],
- doBest(case2[0], case2[1], !player) + numbers[right-1],
- doBest(case3[0], case3[1], !player) + 0,
- doBest(case4[0], case4[1], !player) + 0
);
return ret;
}
int play(int left, int right) {
if(left > right) return 0;
int& ret = cache[left][right];
if(ret != EMPTY) return ret;
ret = max(board[left] - play(left + 1, right),
board[right] - play(left, right - 1));
if(right - left + 1 >= 2) {
ret = max(ret, -play(left + 2, right));
ret = max(ret, -play(left, right - 2));
}
return ret;
}
책과 나의 시도는 코드 자체도 상당히 유사하고, 접근법도 서로 같다. 그럼에도 불구하고 내가 답을 내지 못한 이유를 찾아보았다.
깔끔한 코드를 짜는 것에 집착했고, 게으르게 사고했다. 다음부턴 기능을 하는 코드를 짜는 것을 우선하고, 문제 풀이가 막히면 다시 처음부터 생각해보는 것을 두려워하지 않아야겠다.