Cześć,
niedawno postanowiłem zrobić zadanie o nazwie "Gra" (http://ki.staszic.waw.pl/task.php?name=gra) no i oczywiście okazało się, że nie umiem znaleźć rozwiązania. Poszukałem więc w internecie i znalazłem fajny pomysł na rozwiązanie (https://www.geeksforgeeks.org/optimal-strategy-for-a-game-dp-31/). Spróbowałem to zaimplementować i wrzucić na sprawdzarkę i niby wszystko ładnie, ale na samym końcu wypisuje mi: "Naruszenie ochrony pamięci. Wywołano tgkill()", przez co zdobywam tylko 90 na 100 punktów. Zgaduję, że w którymś momencie wychodzi mi poza tablicę, ale nie mam pojęcia gdzie i dla jakich danych wejściowych. Próbowałem testować mój program dla losowych danych, ale zawsze pokazywał poprawny wynik i nigdy nie zgłaszał żadnego błędu. Serdecznie prosiłbym o pomoc w znalezieniu źródła problemu.
Oto mój kod:
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long int ll;
#define FOR(x, y, z) for(ll z = x; z < y; ++z)
#define REP(x, y) for(ll y = 0; y < x; ++y)
int main()
{
cin.sync_with_stdio(0);
cin.tie(NULL);
ll n, sum = 0;
cin >> n;
ll* arr = new ll[n];
ll** dp = new ll*[n];
REP(n, i)
{
cin >> arr[i];
sum += arr[i];
}
REP(n, i)
dp[i] = new ll[n];
REP(n, i)
REP(n, j)
dp[i][j] = 0;
FOR(0, n, gap)
for (ll i = 0, j = gap; j < n; ++i, ++j)
{
ll x = ((i + 2) <= j) ? dp[i + 2][j] : 0;
ll y = ((i + 1) <= (j - 1)) ? dp[i + 1][j - 1] : 0;
ll z = (i <= (j - 2)) ? dp[i][j - 2] : 0;
dp[i][j] = max(arr[i] + min(x, y), arr[j] + min(y, z));
}
cout << dp[0][n - 1] << " " << abs(sum - dp[0][n - 1]);
}