Jocul nostru presupune parcurgerea unui tablou bidimensional cu două linii şi n
coloane, format din 2•n
celule pătratice. Fiecare celulă are asociată câte o valoare întreagă v
care nu se modifică pe durata desfăşurării jocului. Jucătorii trebuie să găsească un drum de la celula de plecare la celula de sosire care respectă următoarele condiţii:
- celula de plecare este cea din linia
1
şi coloana1
, iar celula de sosire este cea din linia2
şi coloanan
. - nu trece decât cel mult odată prin oricare celulă.
- deplasarea se poate face din celula curentă spre oricare altă celulă învecinată cu ea pe orizontală sau verticală.
- conţine cel mult
k
celule consecutive aflate pe aceeaşi linie.
Pentru un astfel de drum se calculează punctajul acestuia ca fiind egal cu suma valorilor asociate celulelor prin care trece drumul.
Cerinţă
Cunoscând valorile asociate celulelor tabloului, scrieţi un program care determină punctajul maxim care poate fi obţinut în acest joc.
Date de intrare
Fișierul de intrare joc4.in
conține pe prima linie două numere naturale n
şi k
separate printr-un spaţiu cu semnificaţiile din enunţ. Pe fiecare dintre următoarele două linii se găsesc câte n
numere întregi, reprezentând valorile asociate celor 2•n
celule ale tabloului.
Date de ieșire
Fișierul de ieșire joc4.out
va conține pe prima linie numărul întreg p
, reprezentând punctajul maxim care se poate obţine.
Restricții și precizări
2 ≤ n ≤ 5000
2 ≤ k ≤ 10
,k ≤ n
-1000 ≤ v ≤ 1000
- Pentru 40% dintre cazurile de test
n ≤ 40
Exemple
Jocul nostru presupune parcurgerea unui tablou bidimensional cu două linii şi n
coloane, format din 2•n
celule pătratice. Fiecare celulă are asociată câte o valoare întreagă v
care nu se modifică pe durata desfăşurării jocului. Jucătorii trebuie să găsească un drum de la celula de plecare la celula de sosire care respectă următoarele condiţii:
- celula de plecare este cea din linia
1
şi coloana1
, iar celula de sosire este cea din linia2
şi coloanan
. - nu trece decât cel mult odată prin oricare celulă.
- deplasarea se poate face din celula curentă spre oricare altă celulă învecinată cu ea pe orizontală sau verticală.
- conţine cel mult
k
celule consecutive aflate pe aceeaşi linie.
Pentru un astfel de drum se calculează punctajul acestuia ca fiind egal cu suma valorilor asociate celulelor prin care trece drumul.
Cerinţă
Cunoscând valorile asociate celulelor tabloului, scrieţi un program care determină punctajul maxim care poate fi obţinut în acest joc.
Date de intrare
Fișierul de intrare joc4.in
conține pe prima linie două numere naturale n
şi k
separate printr-un spaţiu cu semnificaţiile din enunţ. Pe fiecare dintre următoarele două linii se găsesc câte n
numere întregi, reprezentând valorile asociate celor 2•n
celule ale tabloului.
Date de ieșire
Fișierul de ieșire joc4.out
va conține pe prima linie numărul întreg p
, reprezentând punctajul maxim care se poate obţine.
Restricții și precizări
2 ≤ n ≤ 5000
2 ≤ k ≤ 10
,k ≤ n
-1000 ≤ v ≤ 1000
- Pentru 40% dintre cazurile de test
n ≤ 40
Exemple
6 3 0 -2 5 4 -9 -1 -1 3 2 7 0 1
21 Explicație Jucătorul va parcurge în ordine celulele cu valorile: |
5 5 0 0 4 2 10 2 -3 -8 6 -2
14 Explicație Jucătorul va parcurge în ordine celulele cu valorile: |
5 4 -3 0 5 4 10 -2 3 -2 7 0
22 Explicație Jucătorul va parcurge în ordine celulele cu valorile: |
#include <bits/stdc++.h> using namespace std; ifstream fin("joc4.in"); ofstream fout("joc4.out"); const int Dim = 5001, Inf = 1 << 30; int N, K, s, smax, a[2][Dim], b[2][Dim]; int main() { fin >> N >> K; for(int i = 0; i < 2; i++) for(int j = 0; j < N; j++) fin >> a[i][j]; b[0][0] = a[0][0]; for (int j = 1; j < N; j++) for (int i = 0; i < 2; i++) { smax = -Inf; s = a[i][j]; for (int k = 1; k < K && k <= j; k++) { s += a[i][j - k]; smax = max(smax, s + b[1 - i][j - k]); } b[i][j] = smax; } b[1][N - 1] = max(b[1][N - 1], b[0][N - 1] + a[1][N - 1]); fout << b[1][N - 1]; return 0; }