Se consideră un șir de numere naturale a[1]
, a[2]
, …, a[n]
așezate circular. Acest lucru înseamnă că a[1]
are ca vecini numerele a[n]
și a[2]
, iar a[n]
are ca vecini pe a[n-1]
și a[1]
. Se consideră de asemenea un număr natural K
.
Cerința
Să se determine suma maximă care se poate obține din exact K
secvențe nevide, disjuncte și ne-vecine.
Date de intrare
Fișierul de intrare kds.in
conține pe prima linie numerele naturale n
și K
, iar pe linia a doua, separate prin câte un spațiu, numerele a[1]
, a[2]
, …, a[n]
.
Date de ieșire
Fișierul de ieșire kds.out
va conține un singur număr natural reprezentând suma maximă care se poate obține din K
secvențe nevide, disjuncte și ne-vecine.
Restricții și precizări
2 ≤ 2*K ≤ n ≤ 10000
1 ≤ a[i] ≤ 10000
,i=1..n
- Două secvențe sunt disjuncte dacă nu au niciun element comun.
- Două secvențe sunt ne-vecine dacă sunt separate prin cel puțin un element care nu aparține nici uneia din cele două secvențe.
Exemplu
kds.in
7 2 3 7 2 1 2 4 5
kds.out
20
Explicație
Cele două secvențe sunt 1
și 4 5 3 7
Atenție, nu se pot alege secvențele 3 7 2
și 2 4 5
pentru că ele sunt vecine (5
este vecin cu 3
).
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema KDS:
/* Mihail Cosmin Pit-Rada
O(n * k)
*/
#include<fstream>
using namespace std;
ifstream fin("kds.in");
ofstream fout("kds.out");
int N,K,a[10002], infinit=1000000000;
int best[10002];
int solve(int start, int stop, int ka){
int k, i, x, y, z, j, t, v;
///best[start-1]=infinit;
t=infinit;
for(i=start;i<=stop;i++){
if(a[i]<t)t=a[i];
best[i]=t;
}
for(k=2;k<=ka;k++){
j=start+2*k-4; x=best[j]; y=best[j+1]; t=infinit;
for(i=j+2;i<=stop;i++){
z=best[i]; v=a[i]+x; if(v<t)t=v;
best[i]=t; x=y; y=z;
}
}
return best[stop];
}
int main(){
int i, S, v1, v2;
fin>>N>>K;
S=0;
for(i=1;i<=N;i++){
fin>>a[i];
S=S+a[i];
}
v1=a[1]+solve(3,N-1,K-1);//prima secventa il contine pe a[1]
v2=solve(2,N,K);//a[1] nu face parte din nici o secventa
fout<<S-min(v1,v2)<<"
";
fout.close();
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #1716 KDS
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1716 KDS de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!