Pagini recente » Cod sursa (job #796254) | Cod sursa (job #2958905) | Borderou de evaluare (job #2829851) | Cod sursa (job #241277) | Cod sursa (job #2966407)
#include <fstream>
#include <cstring>
using namespace std;
const int N = 1001;
const int P = 12;
int v[N], vsalt[N + 1], dp[(1 << P)][N];
int main()
{
ifstream in("morcovi.in");
ofstream out("morcovi.out");
int n, m, mask, newmask;
in >> n;
memset(dp, -1e9, sizeof(dp));
for(int i = 0; i < n; i++)
{
in >> v[i];
dp[0][i] = v[i];
}
in >> m;
for(int i = 0; i < m; i++)
{
in >> vsalt[i];
}
for(int mask = 0; mask < (1 << m); mask++)
{
for(int i = 0; i < m; i++)
{
if(mask & (1 << i))
{
newmask = (mask ^ (1 << i));
for(int j = 0; j < n; j++)
{
if(j - vsalt[i] >= 0)
{
dp[mask][j - vsalt[i]] = max(dp[mask][j - vsalt[i]], dp[newmask][j] + v[j - vsalt[i]]);
}
if (j + vsalt[i] < n)
{
dp[mask][j + vsalt[i]] = max(dp[mask][j + vsalt[i]], dp[mask ^ (1 << i)][j] + v[j + vsalt[i]]);
}
}
}
}
}
int sol = -1e9;
for (int i = 0; i < n; i++)
sol = max(sol, dp[(1 << m) - 1][i]);
out << sol;
return 0;
}