メモ化する。
memo[まだ使ってない頂点][片側だけ使っている辺][どちらも空いている辺]
const int D = 52; int t[D][D][D]; int rec(int v, int e, int h, const vector<int> &S) { if (v == 0 && e == 0 && h == 0) { return 0; } if (v == 0) return -(1 << 20); if (t[v][e][h] != -1) { return t[v][e][h]; } int mx = -(1 << 20); for (int i = 0; i <= e; ++i) { for (int j = 0; j <= h; ++j) { if (h + i - j < 0) continue; if (i + j && i + j <= (int)S.size()) { mx = max(mx, rec(v - 1, e - i, h + i - j, S) + S[i + j - 1]); } } } return t[v][e][h] = mx; } class P8XGraphBuilder { public: int solve(vector <int> S) { fill(&t[0][0][0], &t[D-1][D-1][D], -1); return rec(S.size() + 1, S.size(), 0, S); } };