Pagini recente » Cod sursa (job #912713) | Cod sursa (job #3146436) | Cod sursa (job #2163803) | Cod sursa (job #2659325) | Cod sursa (job #530881)
Cod sursa(job #530881)
#include <fstream>
#include <cstdio>
using namespace std;
const char InFile[]="ferma.in";
const char OutFile[]="ferma.out";
const int MaxN=10002;
const int MaxK=1003;
const int INF=1<<30;
ifstream fin(InFile);
ofstream fout(OutFile);
int N,K,A[MaxN][MaxK],B[MaxN][MaxK],V[MaxN],sol;
int main()
{
fin>>N>>K;
for(register int i=1;i<=N;++i)
{
fin>>V[i];
}
fin.close();
for(register int i=0;i<=N;++i)
{
for(register int j=0;j<=K;++j)
{
A[i][j]=B[i][j]=-INF;
}
}
A[1][1]=V[1];
for(register int i=2;i<=N;++i)
{
for(register int j=1;j<=K;++j)
{
A[i][j]=max(max(A[i-1][j],B[i-1][j-1]),A[i-1][j-1]);
B[i][j]=max(A[i-1][j],B[i-1][j]);
A[i][j]+=V[i];
}
}
sol=max(sol,max(A[N][K],B[N][K]));
++K;
for(register int i=0;i<=N;++i)
{
for(register int j=0;j<=K;++j)
{
A[i][j]=B[i][j]=-INF;
}
}
A[1][1]=V[1];
A[2][1]=V[1]+V[2];
A[2][2]=V[1]+V[2];
B[2][1]=V[1];
for(register int i=3;i<=N;++i)
{
for(register int j=1;j<=K;++j)
{
A[i][j]=max(max(A[i-1][j],B[i-1][j-1]),A[i-1][j-1]);
B[i][j]=max(A[i-1][j],B[i-1][j]);
A[i][j]+=V[i];
}
}
sol=max(sol,A[N][K]);
fout<<sol;
fout.close();
return 0;
}