Cod sursa(job #2966407)

Utilizator pifaDumitru Andrei Denis pifa Data 17 ianuarie 2023 15:49:03
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#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;
}