Chcąc przećwiczyc dp, natknąłem się na takie zadanie z OIG: https://szkopul.edu.pl/problemset/problem/PJA7VC3zOTwh1qPU43Wu9O4v/site/?key=statement
3 razy próbowałem napisać zachłana, ale wszystkie trzy się wywaliły, ale napisałem dp na 40pkt, w O(N*K). Mianowicie: dp[i][j] - max wynik, jaki możemy osiągnąć przeglądając stosiki od 0 do i, biorąc dokładnie j elementów.
A - tablica górnych elementów
B - tablica dolnych elementów
dp[0][1] = A[0];
dp[0][2] = A[0] + B[0];
for (int i = 1; i < n; ++i)
{
dp[i][1] = max(dp[i-1][1], A[i]);
dp[i][2] = max(dp[i-1][2], max(dp[i-1][1] + A[i], A[i] + B[i]));
for (int j = 3; j <= k; ++j)
dp[i][j] = max(dp[i-1][j], max(dp[i-1][j-1] + A[i], dp[i-1][j-2] + A[i] + B[i]));
}
No i na koniec zwracam dp[n-1][k].
No i mam problem, jak to przyśpieszyć, o ile się wogóle da.
Z góry dziękuję za pomoc i poświęcony czas!