Problem. A row of coins with values; two players alternately take a coin from either end. Maximize your total.

FactResult
optimal difference (first minus second)interval DP ,
even number of coinsthe first player can never lose: take all odd positions or all even positions
long long coinsInRow(const vector<long long>& v) {                              // best (first - second) with optimal play
    int n = sz(v); vector<vector<long long>> d(n, vector<long long>(n));
    for (int i = n - 1; i >= 0; i--) { d[i][i] = v[i]; for (int j = i + 1; j < n; j++) d[i][j] = max(v[i] - d[i + 1][j], v[j] - d[i][j - 1]); }
    return n ? d[0][n - 1] : 0;
}